我应该如何大括号初始化std :: pairs的std :: array?

时间:2014-12-27 16:29:31

标签: c++ c++11 std-pair stdarray list-initialization

std::array<std::pair<int, int>, 2> ids = { { 0, 1 }, { 1, 2 } };

VS2013错误:

  

错误C2440:'初始化':无法从'int'转换为'std :: pair'没有构造函数可以采用源类型,或者构造函数重载解析是不明确的。

我做错了什么?

2 个答案:

答案 0 :(得分:21)

添加另一对括号。

std::array<std::pair<int, int>, 2> ids = { { { 0, 1 }, { 1, 2 } } };

std::array<T, N>是一个聚合类,包含T[N]类型的成员。通常,您可以使用与普通T[N]数组相同的方式初始化,但是当您处理非聚合元素类型时,您可能需要更明确。

答案 1 :(得分:16)

std::array是一个聚合。它只有一个数据成员 - 指定类型的std::array特化的数组。根据C ++标准。 (8.5.1聚合)

  

2当初始化列表初始化聚合时,如   在8.5.4中指定,初始化列表的元素被视为   增加下标的聚合成员的初始化程序   或会员订单

所以这条记录

std::array<std::pair<int, int>, 2> ids = { { 0, 1 }, { 1, 2 } };

有更多初始值设定项,然后std :: array中有数据成员。

std::array的数据成员又是聚合。您必须为其提供初始化列表。

所以记录看起来像

std::array<std::pair<int, int>, 2> ids = { { { 0, 1 }, { 1, 2 } } };

因为您可以更清楚地想象以下方式进行初始化

std::array<std::pair<int, int>, 2> ids = { /* an initializer for data member of the array */ };

由于数据成员是聚合的,因此您必须编写

std::array<std::pair<int, int>, 2> ids = { { /* initializers for the aggregate data member*/ } };

最后

std::array<std::pair<int, int>, 2> ids = { { { 0, 1 }, { 1, 2 } } };