Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我应该如何初始化std::pairs的std::数组? std::数组id={{0,1},{1,2};_C++_C++11_Std Pair_Stdarray_List Initialization - Fatal编程技术网

C++ 我应该如何初始化std::pairs的std::数组? std::数组id={{0,1},{1,2};

C++ 我应该如何初始化std::pairs的std::数组? std::数组id={{0,1},{1,2};,c++,c++11,std-pair,stdarray,list-initialization,C++,C++11,Std Pair,Stdarray,List Initialization,VS2013错误: 错误C2440:“正在初始化”:无法从“int”转换为“std::pair”。没有构造函数可以采用源类型,或者构造函数重载解析不明确` 我做错了什么?再加一对大括号 std::array<std::pair<int, int>, 2> ids = { { 0, 1 }, { 1, 2 } }; std::数组id={{{0,1},{1,2}}; std::array是一个聚合类,包含类型为T[N]的成员。通常,您可以使用与普通T[N]数组相同的方式

VS2013错误:

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


我做错了什么?

再加一对大括号

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

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

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::pair<int, int>, 2> ids = { { { 0, 1 }, { 1, 2 } } };
std::array id={/*数组的数据成员的初始值设定项*/};
由于数据成员是聚合的,因此必须写入

std::array<std::pair<int, int>, 2> ids = { /* an initializer for data member of the array */ };
std::array id={{{/*聚合数据成员的初始值设定项*/};
最后

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

这似乎可以解释一切,直到你使用
std::make_pair
查看Joachim的答案。如果没有额外的一对括号,这是如何工作的?@TonyK一般来说,括号可以省略<代码>inta[2][2]={0,1,2,3}是完全有效的。但是当您使用用户提供的构造函数处理类时,事情变得有点棘手:
{0,1}
可能是试图初始化第一个元素或第一个子元素。歧义的解决有利于第一个元素。另一方面,
make_pair
的结果只能用于初始化第一个子元素。标准唯一能保证工作的是“
array a={initializer list};
其中initializer list是一个逗号分隔的列表,其中最多有
N个
元素,其类型可转换为
T
”。额外的一对大括号可能适用于所有当前的实现,但不能保证。@t.C.无论如何,现在还不能。关于阵列,有几个相关的未决问题。一个是
数组
的布局应该与
T[N]
兼容。另一个是成员
T元素[N]std::array
的描述中,code>被注释为“仅公开”,其工作方式与[objects.within.classes]p2所说的此类成员的工作方式不同。实际上,这个答案是正确的。对标准的严格解读并不支持这一答案,但确实支持这一立场,即标准完全是错误的,目前还无法从中得出有意义的结论。:)如果数组包含三对,则此处的建议无效:
std::array id={{{{0,1},{1,2},{2,3}}无法编译。但是,去掉
=
会有帮助:
std::数组id{{{{0,1},{1,2},{2,3}}编译时没有错误。我花了很长时间才弄明白。也许应该对答案进行编辑,以便将来的访问者得到警告?另外,我还有一个额外的问题:为什么会这样?如果按照标准,那么就不能保证
std::array
只有一个数据成员。@T.C.如果没有这些信息,就无法正确初始化数组。至少为了说明,该标准在数组定义中包括以下数据成员T元素[N];该标准保证
array a={initializer list}T
),则code>将起作用。无法保证内置数组(如果使用了一个-我不知道不使用一个是否可以满足所有要求)是唯一的数据成员。@T.C.我也不知道什么可以替代数组。如果显式地编写内部表示是数组,似乎会更好。
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 } } };