可能重复:
When can outer braces be omitted in an initializer list?
我在Visual Studio 2010中使用std::array
,实际上是std::tr1::array
而且我遇到了一个恼人的问题。例如,我有一个以array
为参数的函数。
void do_something(std::tr1::array<int, 5> data)
调用类似do_something({1,2,3});
的函数不起作用并导致编译器错误,但是
std::tr1::array<int, 5> data = {1,2,3};
do_something(data);
一样。我真的不明白为什么前者不起作用。我得到的错误告诉我,我在)
之前错过了{
。这让我相信它不会期待初始化列表,但我不明白为什么不这样做。我是否滥用初始化列表?
编辑:std::tr1::array
没有必要,std::array
正常工作..
答案 0 :(得分:3)
试试这个
do_something({{1,2,3}});
std::array
使用2组大括号进行初始化,但在某些情况下(例如您发布的示例),您可以忽略外部虚假括号。这可能会有所帮助:C++11: Correct std::array initialization?
答案 1 :(得分:3)
需要额外的大括号,因为std::array
是聚合和POD,与标准库中的其他容器不同。 std::array
没有用户定义的构造函数。它的第一个数据成员是一个大小为N
的数组(您将其作为模板参数传递),并使用初始化程序直接初始化此成员。 内部数组需要额外的大括号,直接初始化。
将此视为:
struct A
{
int data[2];
};
创建A
实例时需要多少个大括号?
A a{1,2}; //wrong as per the Standard (the compiler might allow it)
A b{ {1,2 } }; //correct
在b
中,外部{}
对用于 struct ,内部对{}
用于成员 - 阵列
希望有所帮助。