函数调用中的std :: array隐式初始化

时间:2013-01-07 06:20:48

标签: c++ c++11 initializer-list

  

可能重复:
  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正常工作..

2 个答案:

答案 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 ,内部对{}用于成员 - 阵列

希望有所帮助。