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

std::array implicit initialization in function call

本文关键字:初始化 数组 函数调用 std      更新时间:2023-10-16

可能重复:
初始化项列表中何时可以省略外大括号?

我在VisualStudio2010中使用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工作得很好。。

试试这个

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

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

需要额外的大括号,因为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中,{}的外对用于结构{}的内对用于成员数组

希望能有所帮助。