C++ 使用嵌套初始值设定项列表聚合std::子对象数组的初始化

C++ 使用嵌套初始值设定项列表聚合std::子对象数组的初始化,c++,initialization,initializer-list,initializer,stdarray,C++,Initialization,Initializer List,Initializer,Stdarray,使用嵌套的大括号初始值设定项列表初始化聚合类型(例如std::array)及其子对象的正确方法是什么?我不想直接调用子类型的构造函数 这是一个反复出现的问题,我总是很惊讶下面的代码不起作用,因为元素的类型是指定的,所以编译器可以推导出正确的构造函数 请注意,示例类型A不一定是聚合(但它当然必须支持括号内的初始值设定项列表) #包括 结构A { int值[4]; }; int main() { 数组arr{{0,1,2,3},{4,5,6,7}; //只有当A是聚合时才有效,而且看起来很混乱,我不

使用嵌套的大括号初始值设定项列表初始化聚合类型(例如
std::array
)及其子对象的正确方法是什么?我不想直接调用子类型的构造函数

这是一个反复出现的问题,我总是很惊讶下面的代码不起作用,因为元素的类型是指定的,所以编译器可以推导出正确的构造函数

请注意,示例类型
A
不一定是聚合(但它当然必须支持括号内的初始值设定项列表)

#包括
结构A
{
int值[4];
};
int main()
{
数组arr{{0,1,2,3},{4,5,6,7};
//只有当A是聚合时才有效,而且看起来很混乱,我不想这样做
//数组arr{0,1,2,3,4,5,6,7};
//我也不想这样做
//数组arr{A{0,1,2,3},A{4,5,6,7};
返回0;
}
但我得到的只是错误

error: too many initializers for 'std::array<A, 2ul>'
错误:“std::array”的初始值设定项太多

您可以在子对象的初始化周围添加大括号,如

std::array<A, 2> arr{{{ 0, 1, 2, 3 }, { 4, 5, 6, 7 }}};
std::数组

嵌套初始值设定项列表周围的大括号可以省略(省略),在这种情况下,根据需要使用尽可能多的初始值设定项子句来初始化相应子集合的每个成员或元素,随后的初始值设定项子句用于初始化对象的以下成员


请注意,第一个初始值设定项子句
{0,1,2,3}
可用于初始化
std::array
的整个内部数组(其余元素将初始化为零)。然后,
{4,5,6,7}
成为多余的子句。

你能详细说明为什么需要这样做吗?我认为使用大括号省略不需要额外的大括号。@plasmacel
std::array arr{{0,1,2,3},{4,5,6,7}
打破了大括号省略规则,初始值设定项有2个子句,与相应子集合的元素数不匹配,
std::array<A, 2> arr{{{ 0, 1, 2, 3 }, { 4, 5, 6, 7 }}};