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)没有得到回答。