据我了解有关联合的 C 和 C++ 标准,如果我尝试访问与实际写入的字段不同的联合的特定字段,这在技术上是未定义的行为。最近一直在查看别人写的一些旧代码,类似如下:
union myunion {
float myfloat;
unsigned int myuint;
};
myunion a;
a.myfloat = 1.01;
myunion b = a;
简而言之,我试图找出以这种方式在联合上使用赋值运算符是否实际上是明确定义的行为。当我自己编写这样的代码时,我会努力存储联合实例主动使用的字段类型,并确保我只读取或写入该值。我猜测使用上面的赋值运算符可能只会导致按位复制(因为在此示例中,字段大小相同),因为在调试器中单步执行代码表明这是正在发生的事情。这段代码一直表现出微妙的错误,所以我很想通过以这种方式直接将联合分配给另一个联合来找出在 UB 意义上是否存在任何固有风险。