据我了解有关 union 的 C 和 C++ 标准,如果我尝试访问与实际写入的字段不同的 union 的特定字段,这在技术上是未定义的行为。最近我一直在审查别人写的一些旧代码,类似于以下内容:
union myunion {
float myfloat;
unsigned int myuint;
};
myunion a;
a.myfloat = 1.01;
myunion b = a;
简而言之,我试图找出以这种方式在 union 上使用赋值运算符是否实际上是明确定义的行为。当我自己编写这样的代码时,我会尽力存储 union 实例主动使用的字段的类型,并确保我只读取或写入该值。我猜测使用上面的赋值运算符可能只会导致按位复制(因为在本例中字段大小相等),因为在调试器中逐步执行代码表明这就是正在发生的情况。这段代码已经表现出了微妙的错误,所以我很想通过这种方式直接将一个 union 分配给另一个 union 来找出 UB 意义上是否存在任何固有的风险。
最佳答案
在 C++11 之前的版本中,union
只能包含 POD(或类似的东西)——这些限制的设计使得按位复制可以工作。在 C++11 中,一些限制已被取消,但如果违反旧的限制,复制和赋值将被删除(除非您自己定义运算符)。
关于c++ - 当 a 和 b 是并集时 a = b 的行为是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14603889/