除非我弄错了,否则应该可以通过以下方式创建一个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 ++库团队搞砸了?
答案 0 :(得分:85)
std::array
很有趣。它的定义基本上是这样的:
template<typename T, int size>
struct std::array
{
T a[size];
};
它是一个包含数组的结构。它没有采用初始化列表的构造函数。但是std::array
是C ++ 11规则的聚合,因此它可以通过聚合初始化来创建。要聚合初始化里面的结构,你需要第二组花括号:
std::array<std::string, 2> strings = {{ "a", "b" }};
请注意,该标准确实表明在这种情况下可以省略额外的括号。所以它可能是一个GCC错误。
答案 1 :(得分:11)
添加到接受的答案:
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>’
我不确定类型推断/转换的哪个方面会使事情以这种方式工作,或者这是否是GCC实现的一个怪癖。