gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:07:59 25 4
gpt4 key购买 nike

(我刚刚意识到,我首先需要通过复制联合来解决一个更基本的问题: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?
}

最佳答案

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

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

关于c++ - 并非所有类型的成员都初始化时,可以复制普通类型的类吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59231856/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com