我的问题是,使用
std :: memcpy
将整个联合对象而不是复制特定的联合成员到未初始化的内存区域中,是否会保留活动联合成员。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`?
std::variant
而不是联合,从而使整个问题无意义。 - Sam Varshavchikundefined-behavior
这个标签,我想指出,根据语言规范来说,malloc
并不能真正地创建对象,因此你应该使用定位 new,另外在访问时可能还需要加上std::launder
才能完全清除潜在的问题。我不记得 C++20 中有多少改变,但我知道没有足够的时间来实现 Richard 的完整提案。(此外,您至少应该可以用reinterpret_cast<T&>
替换*reinterpret_cast<T*>
。) - chrisstd::byte
数组,现在您想要一个A
,这与const
使用类似。逻辑是告诉编译器不要假设只有std::byte[]
,但是细节还是有点模糊。 - chris