Skip to content

败犬日报 2025-03-04

1. union 的默认初始化是什么行为

union 只有当成员都 trivial 的时候才会有默认构造函数,效果是啥都不干。否则会报错,必须显式定义一个。

2. union 用不同的类型读写

cpp
union { T x; U y; }
write(x)
read(y)

这个在 C++ 中是 UB(UB = 未定义行为)。

往期 提到 https://zh.cppreference.com/w/cpp/language/union 有记载:

读取并非最近写入的联合体成员是未定义行为。许多编译器以非标准语言扩展实现读取联合体的不活跃成员的能力。

但是这个 UB 太常见了,编译器一般不会怎么样。但还是需要注意严格别名,不要把指针传播出去,比如:

cpp
union A {
    int x;
    float y;
};
void foo(int*, float*);
void bar() {
    A a;
    a.x = 1;
    foo(&a.x, &a.y);
}