gpt4 book ai didi

c++ - 编译器是否定义了赋值运算符来调用复制构造函数?

转载 作者:太空狗 更新时间:2023-10-29 20:10:06 26 4
gpt4 key购买 nike

三原则是众所周知的,它说如果必须定义析构函数,那么最有可能定义复制构造函数和赋值运算符。

然而,最近在一些代码中,我偶然发现了一个“二元法则”:只定义了析构函数和复制构造函数,赋值运算符留给编译器定义。我的第一个想法是“这一定是个错误”,但现在我不太确定,因为所有编译器(gcc、msvs、intel)都生成了调用复制构造函数的赋值运算符。

简化后,该类如下所示:

struct A{
size_t size;
int *p;
A(size_t s): size(s), p(new int[size]){}

A(const A&a): size(a.size), p(new int[size]){
std::copy(a.p, a.p+a.size, p);
std::cout<<"copy constructor called\n";
}

~A(){
delete[] p;
}
};

像这样使用:

int main(){
A a(2);
a.p[0]=42.0;

A b=a;
std::cout<<"first: "<<b.p[0]<<"\n";
}

产生以下输出:

copy constructor called
first: 42

我的问题:可以保证,编译器定义的赋值运算符将调用复制构造函数,或者这只是一个幸运的巧合,所有编译器都这样做?


编辑: 是的,我混淆了初始化和赋值!将 A b=a; 替换为 A b(0); b=a如预期的那样导致双重错误。

最佳答案

是你误解了发生了什么,根本没有赋值,只有构造和初始化。

当你做的时候

A b = a;

没有赋值,只有初始化。更精确地复制初始化。和写一样

A b(a);

关于c++ - 编译器是否定义了赋值运算符来调用复制构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42069325/

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