Chr*_*s_F 54 c++ libstdc++ c++11
除非我弄错了,否则应该可以通过以下方式创建一个std:array:
std::array<std::string, 2> strings = { "a", "b" };
std::array<std::string, 2> strings({ "a", "b" });
Run Code Online (Sandbox Code Playgroud)
然而,使用GCC 4.6.1我无法使其中任何一个工作.编译器简单地说:
expected primary-expression before ',' token
Run Code Online (Sandbox Code Playgroud)
然而初始化列表与std :: vector一起工作正常.那是哪个呢?我错误地认为std :: array应该接受初始化列表,还是让GNU标准C++库团队搞错了?
Nic*_*las 88
std::array
很有趣.它的定义基本上是这样的:
template<typename T, int size>
struct std::array
{
T a[size];
};
Run Code Online (Sandbox Code Playgroud)
它是一个包含数组的结构.它没有采用初始化列表的构造函数.但它std::array
是C++ 11规则的聚合,因此它可以通过聚合初始化来创建.要聚合初始化结构内的数组,您需要第二组花括号:
std::array<std::string, 2> strings = {{ "a", "b" }};
Run Code Online (Sandbox Code Playgroud)
请注意,该标准确实表明在这种情况下可以省略额外的括号.所以它可能是一个GCC错误.
Jos*_*eph 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'}};
Run Code Online (Sandbox Code Playgroud)
所有工作都在GCC 4.6.3(Xubuntu 12.01)上进行.然而,
void f(std::array<char, 2> a)
{
}
//f({'a', 'b'}); //doesn't compile
f({{'a', 'b'}});
Run Code Online (Sandbox Code Playgroud)
以上需要双括号来编译.带有单个大括号的版本会导致以下错误:
../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>’
Run Code Online (Sandbox Code Playgroud)
我不确定类型推断/转换的哪个方面使得事情以这种方式工作,或者这是否是GCC实现的怪癖.