并非所有类型的成员都初始化时,可以复制普通类型的类吗?

(我刚刚意识到我首先需要通过复制联合来解决一个更基本的问题:When a union object is copied,is a member subobject created?。请先看看其他问题。)

类的隐式生成的复制操作(构造函数和赋值)执行成员复制(初始化或赋值)。 (对于普通类型,它们是相同的。)

由于无法访问未初始化的对象,因此无法复制某些成员未初始化的类。

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?
}
heshenzhi0622 回答:并非所有类型的成员都初始化时,可以复制普通类型的类吗?

是的,您可以通过定义用于复制对象表示形式的默认复制/移动赋值运算符来复制具有未初始化(间接)成员的联合。 (您也可以编写使用std::memcpy的自己的运算符。如果默认的运算符未建立正确的活动成员,并且std::memcpy也应该这样做,这显然是措辞上的缺陷。)

但是,您不能将强制转换为普通类对象的安全副本使用;对该赋值运算符的调用按照所需的special rule具有未定义的行为,因为它不涉及对任何(标量)对象的访问。即使通过std::memcpy(!),您自己的基于reinterpret_cast的实现也可以,但这不具有新闻价值-通过unsigned char(也许还有char)读取/复制不确定的值并且std::bytealways allowed)。

本文链接:https://www.f2er.com/2955411.html

大家都在问