使用花括号初始化std ::元组元组

Ale*_*lex 16 c++ c++11

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

std::array<std::tuple<int, std::string>, 3> tuples{
    {3, "a"},
    {7, "b"},
    {2, "c"}
};
Run Code Online (Sandbox Code Playgroud)

在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>"
Run Code Online (Sandbox Code Playgroud)

Nic*_*las 24

这是一个突出的问题tuple.看,它在C++ 11/14中的构造函数是explicit.因此,它不能参与copy-list-initialization,这是内部braced-init-lists所做的(外部的是直接列表初始化).

这个想法是为了防止你绕过一个类的explicit构造函数tuple.但是,在C++ 17中,这将被改变:如果所有元组的类型本身都可以从相应的给定类型中隐式转换,那么构造函数也是如此tuple.

对于您的特定用例,您可以使用std :: pair.它的构造函数永远不会explicit.