使用花括号初始化一个包含元组的std::array

22

这可能有一个非常简单的答案,但我真的想不出来。为什么我做这个会出错?如何正确地初始化这样的东西?

std::array<std::tuple<int, std::string>, 3> tuples{
    {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>"
1个回答

26

这是tuple的一个突出问题。你可以看看C++11/14中它的构造函数是explicit。因此,它不能参与复制初始化,而这正是内部大括号初始化列表所做的事情(外部的则是直接初始化)。

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

对于您特定的用例,您可以使用std::pair。它的构造函数从不是explicit的。


1
所以这就是为什么另一个人删除的答案在我发布之前实际上起作用了。我以为可能会做一些我没有预料到的事情。猜想我将不得不使用C数组或者那种方式来完成。唉... C++17不能快点到来吗? - Alex
1
@AlexYan:你可以使用pair,因为你当前的类型只有两个成员。 - Nicol Bolas
你知道这个功能叫什么吗?只是好奇现有编译器是否支持它。 - Alex
@black:参考已添加。 - Nicol Bolas
你更期待C++17还是《星球大战8》? - Charles
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接