可能重复:
c++ why initializer_list behavior for std::vector and std::array are different
我定义了一个简单的二维数组(3X2):
std::array<std::array<int,3>,2> a {
{1,2,3},
{4,5,6}
};
我很惊讶这个初始化不起作用,在gcc4.5中产生错误:too many initializers for 'std::array<std::array<int, 3u>, 2u>'
为什么我不能使用这种语法?
我找到了解决方法,其中一个非常有趣,需要额外的括号,但我只是想知道为什么第一种最简单的方法无效?
解决方法:
// EXTRA BRACES
std::array<std::array<int,3>,2> a {{
{1,2,3},
{4,5,6}
}};
// EXPLICIT CASTING
std::array<std::array<int,3>,2> a {
std::array<int,3>{1,2,3},
std::array<int,3>{4,5,6}
};
[更新]
好的,感谢KerrekSB和评论区的帮助,我明白了区别。所以似乎在我的例子中括号太少了,就像这个C语言的例子:
struct B {
int array[3];
};
struct A {
B array[2];
};
B b = {{1,2,3}};
A a = {{
{{1,2,3}},
{{4,5,6}}
}};
std::array
是一个聚合体。 - chrisstd::array<int, 2> a{1,2};
也是不合法的(gcc 4.7.2将错误地接受这样的代码,而clang 3.1则不会)。请参见我上面链接的重复问题。简短的回答是:这是C++11语言标准中已知的缺陷。 - James McNellis