当复制联合对象时,是否会创建成员子对象?

cur*_*guy 5 c++ memcpy object-lifetime unions language-lawyer

当访问联合的另一个成员时,C++ 标准过去对发生的情况保持沉默,但这一点已被修复,以解释允许对联合对象的成员访问是为了分配给该尚不存在的对象,这会神奇地通过分配给对象或其成员之一来创建对象。本质上,成员访问运算符返回未来对象的承诺,您必须将其与赋值一起使用。

给定

union U {
  int i;
  long l;
};
Run Code Online (Sandbox Code Playgroud)

我们可以通过赋值创建一个i或成员子对象:l

U u;
u.i = 2; // creates an int
u.l = 3; // creates a long (destroys the int)
Run Code Online (Sandbox Code Playgroud)

但是当联合对象被复制时会发生什么?编译器如何“知道”要“创建”哪个成员?

U u1, u2;
fill(&u1);
u2 = u1; // which u2 member is created here?
Run Code Online (Sandbox Code Playgroud)

当在填充memcpy有数值的字节缓冲区(不是从另一个联合对象填充)中使用联合时,哪个成员变为“活动”?

char buf[sizeof(U)] = { ... };
U u;
memcpy(&u, buf, sizeof u);
Run Code Online (Sandbox Code Playgroud)