在下面的程序中,联合体
U
有两个字段a
和b
,每个字段都有不同的默认值。如果使用聚合初始化{}
创建一个U
类型的变量,那么联合体的值和活动成员是什么?#include <iostream>
struct A { int x = 1; };
struct B { int x = 0; };
union U {
A a;
B b;
};
int main() {
U u{};
std::cout << u.a.x;
}
令人惊讶的是编译器在这里出现了分歧:Clang打印1
,而GCC打印0
,演示:https://gcc.godbolt.org/z/8Tj4Y1Pv1
其中一个编译器存在错误吗?还是这里的行为不受标准定义?
u
时,您正在执行 值初始化。由于U
不是类类型,因此会导致u
被 零初始化。 - Some programmer dudeU
是一个类类型,它是联合聚合类。请注意规范术语“非联合聚合”,例如在 [dcl.init.aggr]/5 中使用。因此,这是聚合初始化,适用于 [dcl.init.aggr]/5(后跟 /5.1 以获取联合的第一个数据成员a
的信息)对U u{};
进行初始化。 - dfrib