C++ 用大括号初始化std::元组数组

C++ 用大括号初始化std::元组数组,c++,c++11,C++,C++11,这可能有一个非常简单的答案,但我真的不明白。为什么我这样做会出错?初始化这样的东西的正确方法是什么 std::array<std::tuple<int, std::string>, 3> tuples{ {3, "a"}, {7, "b"}, {2, "c"} }; std::数组元组{ {3,“a”}, {7,“b”}, {2,“c”} }; 在MSVC 2015上,我发现以下错误: No suitable constructor exis

这可能有一个非常简单的答案,但我真的不明白。为什么我这样做会出错?初始化这样的东西的正确方法是什么

std::array<std::tuple<int, std::string>, 3> tuples{
    {3, "a"},
    {7, "b"},
    {2, "c"}
};
std::数组元组{ {3,“a”}, {7,“b”}, {2,“c”} };
在MSVC 2015上,我发现以下错误:

No suitable constructor exists to convert from "int" to "std::tuple<int, std::string>"
No suitable constructor exists to convert from "const char[2]" to "std::tuple<int, std::string>"
不存在合适的构造函数将“int”转换为“std::tuple”
没有合适的构造函数将“const char[2]”转换为“std::tuple”

这是元组的一个突出问题。看见因此,它不能参与复制列表初始化,这是内部带括号的init列表所做的(外部列表是直接列表初始化)

我的想法是。但是,在C++17中,这将被改变:如果所有元组的类型本身都可以从相应的给定类型隐式转换,那么
元组的构造函数也将如此


对于您的特定用例,您可以使用std::pair。它的构造函数从来都不是显式的,所以这就是为什么在我发布之前,另一个人删除的答案实际上是有效的。我想那可能是在做我没想到的事。我想我必须使用一个C数组,或者那样做。啊。。。C++17的速度不快enough@AlexYan:您可以使用
pair
,因为您当前的类型只有两个成员。“其目的是防止您能够通过tuple绕过类的显式构造函数”您是否有讨论过的位置的引用?您知道这称为什么功能吗?我只是好奇在当前的任何一个网站上是否有人支持它compilers@AlexYan当前位置我怀疑这是否有正式名称。但是