将std :: array与初始化列表一起使用

时间:2011-11-19 05:46:51

标签: c++ c++11 libstdc++

除非我弄错了,否则应该可以通过以下方式创建一个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 ++库团队搞砸了?

2 个答案:

答案 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实现的一个怪癖。