在初始化列表中使用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实施的一个怪癖。