败犬日报 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);
}