为什么赋值初始化在不使用复制构造函数的情况下需要复制构造函数

Why initialization by assignment needs copy constructor if it does not use it

本文关键字:复制 构造函数 情况下 初始化 赋值 为什么      更新时间:2023-10-16

考虑以下代码:

class X {
    int a;
public:
    X(int a) : a(a){std::cout<<"in constructor";}
    // X(const X& x) : a(x.a){std::cout<<"in copy constructor";}
    X(const X& x) = delete;
    X& operator=(const X& x) {
        std::cout<<"in assignment";
        a = x.a;
        return *this;
    }
};

int main(int argc, char *argv[]) {
    X x = X(5);// error: `use of deleted function`
    return 0;
}

给出一个错误:use of deleted function。然而,如果我取消注释复制构造函数并删除delete行,它会正常工作,但不使用复制构造函数(输出为:in constructor)。

那么如果X x = X(5);行在定义时不使用复制构造函数,为什么它在删除时尝试使用它?

问题在你的main:行

X x = X(5);

复制初始化——它看起来像一个赋值操作符,但它在底层被复制构造函数取代。

按以下方式重写代码可以修复这个问题,因为它没有给编译器留下避免使用赋值操作符的选项:

X x1(3);
X x2(5);
x1 = x2;

演示。