(我刚刚意识到我首先需要解决复制联合的一个更基本的问题:复制联合对象时,是否创建了成员子对象?请先查看其他问题。)
类的隐式生成的复制操作(构造函数和赋值)执行逐个成员的复制(初始化或赋值)。(对于普通类型,这些是相同的。)
因此,无法复制具有某些未初始化成员的类,因为访问未初始化的对象是非法的。
struct C {
int m1, m2;
};
void f() {
C c1, c2;
c1.m1 = 1;
c2 = c1; // not initialized
}
但是一个联合总是可以被复制,即使它包含类成员,其中一些没有初始化(因为......根据定义,联合的两个成员没有被初始化)。
这是否意味着复制具有未初始化成员的类的联合是合法的:
union U {
C m;
};
void g() {
U u1, u2;
u1.m.m1 = 1;
u2 = u1;
}
如果是这样,可以通过强制转换到这样的联合来复制类吗?
void f2() {
C c1, c2;
c1.m1 = 1;
(U&)c2 = (U&)c1; // not initialized?
}