C++ 为什么可以';t std::数组<;std::pair<;int,int>;,3>;可以使用嵌套的初始值设定项列表初始化,但std::vector<;std::pair<;int,int>&燃气轮机;可以

C++ 为什么可以';t std::数组<;std::pair<;int,int>;,3>;可以使用嵌套的初始值设定项列表初始化,但std::vector<;std::pair<;int,int>&燃气轮机;可以,c++,stdarray,aggregate-initialization,C++,Stdarray,Aggregate Initialization,请参见此示例: 为什么这个成对数组不能以与成对向量相同的方式初始化 #include <vector> #include <array> int main() { std::vector<std::pair<int,int>> v{{1,2},{3,4},{5,6}}; // succeeds std::array <std::pair<int,int>, 3> a{{1,2},{3,4},{5,6

请参见此示例:

为什么这个成对数组不能以与成对向量相同的方式初始化

#include <vector>
#include <array>

int main()
{
    std::vector<std::pair<int,int>>    v{{1,2},{3,4},{5,6}}; // succeeds 
    std::array <std::pair<int,int>, 3> a{{1,2},{3,4},{5,6}}; // fails to compile
}
#包括
#包括
int main()
{
向量v{{1,2},{3,4},{5,6};//成功
数组a{{1,2},{3,4},{5,6};//编译失败
}

您需要添加一对外部大括号来初始化
std::array
对象本身:

std::array <std::pair<int,int>, 3> a{{{1,2},{3,4},{5,6}}};
std::数组a{{{1,2},{3,4},{5,6}};

最外面的一对用于数组对象,第二对用于对象内部的聚合数组。然后数组中的元素列表。

类模板的专门化
std::array
表示包含另一个聚合的聚合

错误的原因是该声明中第一个带括号的初始值设定项

std::array <std::pair<int,int>, 3> a{{1,2},{3,4},{5,6}};
                                     ^^^^^
std::数组a{1,2},{3,4},{5,6};
^^^^^
被视为内部聚合的初始值设定项。在这种情况下,以下带括号的初始值设定项被视为冗余初始值设定项

所以你也可以写

std::array <std::pair<int, int>, 3> a{ { {1,2},{3,4},{5,6} } };
                                       ^                   ^
                                       |the inner aggregate|
std::数组a{{{1,2},{3,4},{5,6}};
^                   ^
|内聚集体|
或者

std::array <std::pair<int, int>, 3> a{ std::make_pair( 1, 2 ), std::make_pair( 3, 4 ), std::make_pair( 5, 6 ) };
std::数组a{std::make_-pair(1,2),std::make_-pair(3,4),std::make_-pair(5,6)};

A今天被问到,但是用了
struct
而不是
std::pair
。但是这里的答案和这里的任何一个答案都是一样的。(或者可能不是-关于赋值而不是构造函数?@AdrianMole,但是使用
struct
而不是
std::pair
我希望它实际上是一个(模板)
struct
;-)@Scheff我不能不同意(即使我想,但我不同意)。值得一提的是,std::array没有初始值设定项\列表构造函数,而vector有。@iwans std::array是一个聚合。它没有用户声明的构造函数。:@VladfromMoscow那太糟糕了,不是吗?@Peter,我不这么认为。这个类(聚合)模拟了一个数组,而这个数组又是聚合。那么为什么
vector
不同于
array
std::array
是一个聚合,所以你需要
{}
来构造
std::array
类,以及
{}
来构造它的成员数组
std::vector
有一个构造函数,它接受一个
std::initializer\u列表
,所以用来构造向量的
{}
会自动调用它。@MooingDuck啊,这实际上是两种不同的机制?带有向量的显式构造函数和带有数组的普通旧聚合初始化?@MooingDuck也:我可以聚合初始化一个std::vector(它当然也是聚合的)?@Peter:不,“聚合”基本上是“一个成员都是公共的,没有显式构造函数的类”,它允许您直接构造
std::array
的数组成员。相反,
std::vector
具有您自己无法访问的私有成员和自定义构造函数,因此它不是聚合。