2014-12-27 98 views

回答

17

添加另一对括号。

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

std::array<T, N>是含有T[N]类型的成员的聚合类。通常情况下,您可以使用与原始数组相同的方式进行初始化,但在处理非聚合元素类型时,可能需要更加明确。

+0

这似乎解释了一切,直到你看到Joachim的答案使用'std :: make_pair'。 _that_如何工作,而不需要额外的一对括号? – TonyK 2014-12-27 17:24:59

+0

@TonyK一般来说,大括号可以省略。 'int a [2] [2] = {0,1,2,3};'是完全有效的。但是当你用用户提供的构造函数处理类时,事情会变得棘手:“{0,1}”可能是尝试初始化第一个元素或第一个子元素。第一个因素有利于解决歧义问题。另一方面,'make_pair'的结果只能用于初始化第一个子元素。 – hvd 2014-12-27 17:35:54

+0

标准保证工作的唯一方法是:'array a = {initializer-list};'where * initializer-list *是一个逗号分隔的列表,其中的类型可转换为'T' ”。额外的一对大括号可能适用于所有当前的实现,但不能保证。 – 2014-12-27 17:44:45

13

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

2 When an aggregate is initialized by an initializer list, as specified in 8.5.4, the elements of the initializer list are taken as initializers for the members of the aggregate, in increasing subscript or member order

所以这个记录

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

具有更多的初始化再就是在标准::阵列数据成员。

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 } } }; 
+2

如果你按照标准行事,那么不能保证'std :: array'只有一个数据成员。 – 2014-12-27 17:40:02

+0

@ T.C。没有这些信息,你无法正确初始化数组。至少为了说明,标准在数组定义中包括以下数据成员T elems [N]; – 2014-12-27 17:45:32

+0

该标准保证'array a = {initializer-list};'将在初始化程序列表最多包含N个可转换为T的类型的元素时起作用。不能保证内置数组是唯一的数据成员(如果使用的话 - 我不知道是否可以遵守所有的要求而不使用它)。 – 2014-12-27 17:50:55