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