在初始化列表中使用std :: array

除非我错了,应该可以用这些方法创build一个std:数组:

std::array<std::string, 2> strings = { "a", "b" }; std::array<std::string, 2> strings({ "a", "b" }); 

然而,使用GCC 4.6.1我无法得到任何这些工作。 编译器只是说:

 expected primary-expression before ',' token 

而初始化列表工作正常与std :: vector。 那是哪个呢? 我误以为std :: array应该接受初始化列表,还是让GNU标准C ++库团队疯狂?

std::array很有趣。 它基本上是这样定义的:

 template<typename T, int size> struct std::array { T a[size]; }; 

它是一个包含数组的结构。 它没有一个构造函数需要一个初始化列表。 但是std::array是C ++ 11规则的集合,因此它可以通过聚合初始化来创build。 要在结构中聚合初始化数组,需要第二组花括号:

 std::array<std::string, 2> strings = {{ "a", "b" }}; 

请注意,标准确实表明在这种情况下可以省略额外的大括号。 所以这可能是一个GCC的错误。

要添加到接受的答案:

 std::array<char, 2> a1{'a', 'b'}; std::array<char, 2> a2 = {'a', 'b'}; std::array<char, 2> a3{{'a', 'b'}}; std::array<char, 2> a4 = {{'a', 'b'}}; 

所有的工作在GCC 4.6.3(Xubuntu 12.01)。 然而,

 void f(std::array<char, 2> a) { } //f({'a', 'b'}); //doesn't compile f({{'a', 'b'}}); 

以上需要双括号才能编译。 带有单个大括号的版本会导致以下错误:

 ../src/main.cc: In function 'int main(int, char**)': ../src/main.cc:23:17: error: could not convert '{'a', 'b'}' from '<brace-enclosed initializer list>' to 'std::array<char, 2ul>' 

我不确定types推断/转换的哪个方面使事情以这种方式工作,或者如果这是GCC实施的一个怪癖。