c++ - 当 a 和 b 是并集时 a = b 的行为是什么?

标签 c++ c unions

据我了解有关 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/

相关文章:

c - 如何将 VSTS .lib 转换为 MinGW .a?

c++ - void() 用作模板参数时意味着什么?

c - 当我从 libgit2 中包含 git2.h 时,我可以访问数据结构,但不能访问函数

c++ - OpenMP:有人知道堆损坏的原因吗?

union 成员的 C++ 生命周期

C - 使用 union ,分配内存

c - 访问不同结构的相同成员

c++ - 如何将 boost::iostreams::null_sink 用作 std::ostream

c++ - uint64_t t3 = MAXDWORD + 1 == 0?

c++ - 什么时候对标量调用 stable_sort()?