已定义
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 ++吗?
答案 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 初始化。