C :嵌套结构的平面初始化列表

C++: flat initializer list for nested struct?

本文关键字:平面 初始化 列表 结构 嵌套      更新时间:2023-10-16

已定义

struct A {
  int a,b;
};
struct B {
  A a;
  int b;
};

以下初始化很明显:

B b1 = { { 1 } };    // initializes b1.a.a
B b2 = { { 1, 2 } }; // initializes b1.a.a, b1.a.b
B b3 = { { 1 }, 2 }; // initializes b1.a.a, b1.b

,但我很惊讶VC 2013还允许这些初始化而没有任何警告:

B b4 = { 1 };       // initializes b4.a.a
B b5 = { 1, 2 };    // initializes b5.a.a, b5.a.b
B b6 = { 1, 2, 3 }; // initializes b6.a.a, b6.a.b, b6.b

是嵌套结构/类的平面初始化列表标准C ?

是的,这是标准的C 。在汇总初始化(and 仅在汇总初始化中,而不是在其他形式的列表初始化中),可以将括号伸出,从而有效地扁平骨料的遏制层次结构。

是的,它是标准 c ,在 8.5初始化器中描述了。。

它称为 brace Elision ,可以在汇总初始化的情况下应用。

来自 n4296 8.5.1.12骨料

括号可以在初始化列表中省略,如下所示。如果是 初始化列表始于左支架,然后是成功的 逗号分隔的initializer-clauses列表初始化 亚凝集;有更多的东西是错误的 初始化式示例比成员。但是,如果是初始化列表 因为亚凝集材料不是从左支架开始的 从列表中获取足够的初始化器示例来初始化 亚参议员的成员;剩余的任何初始用式扣除是 剩下的来初始化骨料的下一个成员 当前的子聚集是成员。

这是 8.5.1.13 的另一个示例:

struct A {
    int i;
    operator int();
};
struct B {
    A a1, a2;
    int z;
};
A a;
B b = { 4, a, a };

在此示例中以 operator int()的结果初始化, a 。。