C++ 容器std::array的列表初始化需要双大括号
用户定义类型的容器的列表初始化行为与我预期的不同。 请参阅此代码段:C++ 容器std::array的列表初始化需要双大括号,c++,curly-braces,stdarray,list-initialization,C++,Curly Braces,Stdarray,List Initialization,用户定义类型的容器的列表初始化行为与我预期的不同。 请参阅此代码段: #包括 结构A{ 字符C; int-s; }; int main(int argc,char*argv[]){ A x={'x'},y={'y'}; std::数组i={1,2};//确定 std::数组a={x,y};//确定 //数组b={{'x',1000},{'y',2000};//错误:初始值设定项太多!!! 数组c={A{'x',1000},A{'y',1000}; 数组d={{{'x',1000},{'y',10
#包括
结构A{
字符C;
int-s;
};
int main(int argc,char*argv[]){
A x={'x'},y={'y'};
std::数组i={1,2};//确定
std::数组a={x,y};//确定
//数组b={{'x',1000},{'y',2000};//错误:初始值设定项太多!!!
数组c={A{'x',1000},A{'y',1000};
数组d={{{'x',1000},{'y',1000};//好的!!
数组e={x',2000',y',5000};//好的!!
}
我可以初始化I
,就像它是一个基本数组一样。我也可以用a做同样的事情,只要它们是变量。但是如果不指定类型A
,例如在c
中,我无法初始化b
std::array
,而不显式说明类型A
,我必须添加另一对大括号。需要双括号背后的逻辑是什么?为什么不能像在b
中那样,用一对大括号围绕列表初始化它
c
可以工作,它只生成两个对象!直观地说,我认为e
会产生错误,因为最多2个对象有4个初始值,但是编译器会正确地填充a
的成员!为什么会发生这种情况
大括号嵌套得很深,在考虑任何类型信息之前,都会与被初始化对象的结构相匹配。由于
std::array
必须包含一个真正的T[N]
(而不是一个),因此结构是数组中有一个对象,即数组。因此,使用两个大括号开始该数组的初始值设定项,如果需要整个嵌套集来初始化一个数组元素,或者如果存在多个这样的嵌套集,则该初始值设定项不起作用
当某个初始值设定项子句是表达式时,即使是A{…}
,此分解也会停止,初始值设定项将用于一个子对象。但是,如果无法将该表达式转换为相应子对象的类型,并且该类型本身是聚合类型,则会发生大括号省略,并且尽管缺少大括号,但后续的初始值设定项将用于其子对象。当这适用于T[N]
对象本身时,数组
可以仅用一层大括号初始化
因此,简而言之,无论是否有效,开括号都会导致聚合分解,但类型不匹配也会导致聚合分解。这解决了一个类似于1)的问题,但2)没有得到回答。