使用C ++ 14标准时,std::array
可以使用单个花括号对a进行初始化(请参见http://en.cppreference.com/w/cpp/container/array):
然而,这并没有为工作std::array
的std::pair
。
为什么这些工作:
std::pair<int, int> p { 1, 2 };
std::array<int, 3> a {1, 2, 3};
但是这不工作:
std::array<std::pair<int, int>, 3> b {{1, 11}, {2, 22}, {3, 33}};
虽然这又可以工作?
std::array<std::pair<int, int>, 3> b {{{1, 11}, {2, 22}, {3, 33}}};
另外,为完成起见,一个好的旧数组的初始化确实可以使用单个花括号
std::pair<int, int> c[3] {{1, 11}, {2, 22}, {3, 33}};
这似乎是一种解析性的不确定性,与著名的最烦人的解析有些相似。我怀疑这是怎么回事:
如果你写
std::array<std::pair<int, int>, 3> b {{1, 11}, {2, 22}, {3, 33}};
编译器有两种解释语法的方法:
您执行全括号初始化(这意味着最外面的括号指的是的聚合初始化std::array
,而第一个最里面的括号则初始化其内部成员表示std::array
形式是一个真正的C数组)。这将无法编译,因为std::pair<int, int>
随后无法初始化1
(所有大括号都用完了)。clang将给出一个编译器错误,确切表明:
error: no viable conversion from 'int' to 'std::pair<int, int>'
std::array<std::pair<int, int>, 3> a{{1, 11}, {2, 22}, {3, 33}};
^
另请注意,如果没有内部成员聚合要初始化,则可以解决此问题,即
std::pair<int, int> b[3] = {{1, 11}, {2, 22}, {3, 33}};
可以像聚合初始化一样编译。
(您的意思。)执行大括号删除初始化,因此最里面的大括号用于单个对的集合初始化,而内部数组表示形式的大括号被删除。请注意,即使没有这种歧义,正如rustyx的答案中正确指出的那样,括号省略规则也不适用,因为std::pair
没有聚合类型,因此程序仍会格式错误。
编译器将首选选项1。通过提供额外的花括号,您可以执行大括号初始化并消除语法上的歧义。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句