c++ - 如果不使用赋值初始化为什么需要复制构造函数

标签 c++

考虑以下代码:

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);

copy initialization - 它看起来像一个赋值运算符,但在底层被复制构造函数取代。

按如下方式重写代码可以解决问题,因为它不会让编译器选择避免使用赋值运算符:

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

Demo.

关于c++ - 如果不使用赋值初始化为什么需要复制构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33328369/

相关文章:

c++ - 如果我输入字母而不是数字,为什么会出现无限循环?

c++ - 使用 CQL 准备的查询在 C++ 中管理计数器

c++ - 由于私有(private)继承而无法访问的类型

c++ - 如何使用 C++ 驱动程序将 mongodb 数组保存到 vector 中?

c++ - 初学者在运行简单代码时出现 fatal error lkn1104

c++ - int32 溢出后可能的值是多少?

c++ - 为结构体灵活数组赋值

c++ - 查找不重复的字符串排列

c++ - 如何将值从 C++ 可执行文件传递到 Rails 应用程序?

c++ - 无需按 ENTER 键即可从 STDIN 读取