为什么在C ++ 14中对数组的初始化仍然需要双花括号?

Chiel:

使用C ++ 14标准时,std::array可以使用单个花括号对a进行初始化(请参见http://en.cppreference.com/w/cpp/container/array):

然而,这并没有为工作std::arraystd::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}};
乔多克(Jodocus):

这似乎是一种解析性的不确定性,与著名的最烦人的解析有些相似我怀疑这是怎么回事:

如果你写

std::array<std::pair<int, int>, 3> b {{1, 11}, {2, 22}, {3, 33}};

编译器有两种解释语法的方法:

  1. 您执行全括号初始化(这意味着最外面的括号指的是的聚合初始化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}};
    

    可以像聚合初始化一样编译。

  2. (您的意思。)执行大括号删除初始化,因此最里面的大括号用于单个对的集合初始化,而内部数组表示形式的大括号被删除。请注意,即使没有这种歧义,正如rustyx的答案中正确指出的那样,括号省略规则也不适用,因为std::pair没有聚合类型,因此程序仍会格式错误

编译器将首选选项1。通过提供额外的花括号,您可以执行大括号初始化并消除语法上的歧义。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在C ++ 11中对结构数组进行括号初始化

C ++和Java中的花括号初始化

C ++标准允许双括号标量初始化吗?

为什么列表初始化(使用花括号)比其他方法更好?

为什么我可以在C#中像数组一样初始化List?

为什么在C ++ 11 / C ++ 14中针对自动和支撑初始化程序有特殊的类型推导规则?

当parens初始化时,构造函数初始化列表中的C ++ 11大括号初始化为什么不起作用?

为什么在初始化此结构时需要更多的花括号?

在C ++中初始化对数组

为什么花括号或等于初始化器花括号或等于?

为什么const变量不需要在C中初始化?

为什么不必初始化数组中的结构?

为什么数组<T *,N>的元素的默认初始化需要C ++ 14?

C ++ const引用初始化和花括号语法

数组中的括号初始化C ++

为什么用花括号进行复制初始化会忽略C ++中的复制/移动构造?

使用花括号在C ++中初始化变量时出现意外结果

在对成员变量进行花括号初始化之后,为什么还需要另一组花括号?

数组未在C ++中使用花括号进行初始化

为什么在Big O中不对数组进行排序/初始化?

为什么C ++中的成员初始化需要新的语法?

C:为什么我不能用大括号初始化数组内的结构?

从花括号括起来的列表初始化数组的 C++ 怪异

为什么这个模板化函数不能对数组进行零初始化编译?

C++ 错误:“数组必须用花括号括起来的初始值设定项进行初始化”

为什么结构数组不需要大括号初始化?

为什么 range::single_view 对底层值使用花括号初始化?

为什么我需要在 C 中初始化 pthread 互斥锁?

为什么 C++ 中类字段的默认初始化需要析构函数调用?