在 C++ 中,从最近编写的 union 成员(即事件 union 成员)中读取是明确定义的。
我的问题是是否std::memcpy
将整个 union 对象复制到未初始化的内存区域,而不是将特定 union 成员复制到未初始化的内存区域将保留事件 union 成员。
union A {
int x;
char y[4];
};
A a;
a.y[0] = 'U';
a.y[1] = 'B';
a.y[2] = '?';
a.y[3] = '\0';
std::byte buf[sizeof(A)];
std::memcpy(buf, &a, sizeof(A));
A& a2 = *reinterpret_cast<A*>(buf);
std::cout << a2.y << '\n'; // is `A::y` the active member of `a2`?
最佳答案
你的作业没问题,因为 the assignment to non-class member a.y
"begins its lifetime" .但是,您的 std::memcpy
不这样做,所以对 a2
的成员的任何访问无效。因此,您依赖于未定义行为的后果。从技术上讲。在实践中,大多数工具链对原始类型 union 成员的别名和生命周期都相当宽松。
不幸的是,这里有更多的 UB,因为您违反了 union 本身的别名:您可以假装 T
是一堆字节,但是 you can't pretend that a bunch of bytes is a T
,不管多少reinterpret_cast
你做的。你可以实例化一个 A a2
通常和 std::copy
/std::memcpy
来自 a
,然后你就回到了 union 成员的终身问题,如果你关心的话。但是,我想,如果这个选项对你开放,你只会写 A a2 = a
首先…
关于c++ - 在整个 union 上使用 std::memcpy 是否保证保留事件的 union 成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62253409/