【发布时间】:2015-04-16 23:13:17
【问题描述】:
我想知道,为什么在下面的代码中声明 std_arr 会产生错误,而 c_arr 编译得很好:
struct S { int a, b; };
S c_arr[] = {{1, 2}, {3, 4}}; // OK
std::array<S, 2> std_arr = {{1, 2}, {3, 4}}; // Error: too many initializers
std::array 和 S 都是聚合。来自aggregate initialization on cppreference.com:
如果初始化子句是一个嵌套的braced-init-list(它不是一个表达式并且没有类型),那么对应的类成员是 本身就是一个聚合:聚合初始化是递归的。
为什么std::array 的这个初始化不能编译?
【问题讨论】:
-
它应该是
std::array<S, 2> std_arr{{ {1, 2}, {3, 4} }};- 围绕构造函数参数的外部参数,初始化列表的下一对,每个S元素的内部对。 C++14 将使它与更少的一组外部{ }一起工作。 (=是可选的。) -
@remyabel 聚合初始化的规则在 C++11 和 C++14、IIRC 之间发生了变化,我不清楚它们在这里不相关。
-
@hvd 不过大括号省略没有变化。
-
你说:“嘿,我读了标准,它说我应该能够做 X,但是当我做我的编译器时会哭”。您不认为指定编译器和您正在使用的版本可能相关吗?
-
@remyabel 啊,这个几乎重复的答案给出了答案:大括号省略在 C++11 和 C++14 之间没有变化,但在后 C 中确实发生了变化应用于 C++11 的 ++11 个 DR。因此,您在
-std=c++11和-std=c++14的编译器中看不到差异是正确的:即使在 C++11 模式下也应用了 DR 分辨率。除此之外,它涵盖了std::array<S, 2> std_arr {1, 2, 3, 4};没有=,因此无论如何它与这个特定问题无关。 :)
标签: c++ arrays initialization c++14 aggregate-initialization