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

时间:2016-12-18 20:49:54

标签: c++ c++11 visual-c++ visual-studio-2013

已定义

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 ++吗?

2 个答案:

答案 0 :(得分:3)

是的,这是标准的C ++。在聚合初始化(和聚合初始化,而不是其他形式的列表初始化)中,可以省略大括号,有效地展平聚合的包含层次结构。

答案 1 :(得分:1)

是的,它是 8.5初始化程序中描述的标准 C ++

它被称为大括号,可以在聚合初始化的情况下应用。

来自 n4296 8.5.1.12聚合

  

可以在初始化列表中省略大括号,如下所示。如果   初始化列表以左括号开头,然后是成功   逗号分隔的initializer-clauses列表初始化成员   分组;有更多的是错误的   初始化者 - 条款比成员。但是,如果是初始化列表   对于subaggregate,不是以左括号开头,而是仅以左括号开头   从列表中获取足够的初始化子句来初始化   分组成员;任何剩余的初始化条款都是   左边初始化聚合的下一个成员   current subaggregate是会员。

以下是 8.5.1.13

的另一个例子
struct A {
    int i;
    operator int();
};

struct B {
    A a1, a2;
    int z;
};

A a;
B b = { 4, a, a };

在此示例中,使用 4 初始化 a1 ,使用 a z初始化 a2 使用 operator int()的结果为 a 初始化