1

可能重复:
什么时候可以在初始化列表中省略外括号?

std::array在 Visual Studio 2010 中使用,实际上std::tr1::array我遇到了一个烦人的问题。例如,我有一个以 aarray作为参数的函数。

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工作正常..

4

2 回答 2

3

试试这个

do_something({{1,2,3}});

std::array使用 2 组大括号进行初始化,但在某些情况下(例如您发布的示例),您可以省略外部虚假大括号。这可能会有所帮助:C++11:正确的 std::array 初始化?

于 2013-01-07T06:35:01.283 回答
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,内部对{}用于member-array

希望有帮助。

于 2013-01-07T06:38:05.690 回答