【发布时间】:2021-10-23 03:26:44
【问题描述】:
在下面的程序中,联合 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时,你正在做value initialization。而且由于U不是类类型,所以会导致u成为zero initialized。 -
令人惊讶的是编译器在这里出现分歧:Clang 打印 1 和 GCC 打印 0 - 似乎有缺陷,应该是 0
-
@Someprogrammerdude
U是一个类类型,它是联合聚合类。注意规范性术语“non-union aggregate”,例如在 [dcl.init.aggr]/5 中使用。因此,这是聚合初始化,并且 [dcl.init.aggr]/5 适用(/5.5 表示U u{};,然后 /5.1 表示联合的第一个数据成员a)。
标签: c++ language-lawyer unions aggregate-initialization