【发布时间】:2012-10-02 09:47:10
【问题描述】:
可能重复:
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 和 cmets,我明白了。因此,我的示例中的大括号似乎太少了,就像在这个 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是一个聚合。 -
我也希望这能奏效。顺便说一句,另一种解决方法是省略内部大括号,尽管它会在 gcc 4.8 上产生警告。
-
多维情况与单维情况没有什么不同,尽管编译器支持可能会有所不同。
std::array<int, 2> a{1,2};也是格式错误的(gcc 4.7.2 将错误地接受此类代码;clang 3.1 不会)。请参阅我上面链接的副本。简短的回答是:这是 C++11 语言标准中的一个已知缺陷。
标签: c++ stl c++11 initialization