首页 > 解决方案 > 为什么定义移动构造函数会删除移动赋值运算符

问题描述

当我写"f5() = X(33);"(在注释行中移动构造函数时)编译器不会抛出错误。但是当我添加一个 Move Constructor 编译器时说:

" 'X &X::operator =(const X &)': attempting to reference a deleted function "

是移动构造函数删除赋值运算符??

#include <iostream>

class X {
    int* p;
public:
    X(int ii = 0) { p = new int(ii); };
    X(const X& obj) { this->p = new int(*(obj.p)); };
//  X(X&& obj) { this->p = new int(*(obj.p)); delete obj.p; obj.p=nullptr;
};



X f5() {
    return X(5);
}

int main() {

    f5() = X(33);
    system("pause");
}

标签: c++

解决方案


f5() = X(33);

将调用赋值运算符,因为那里已经存在 X 对象。这是一个任务,而不是一个结构。在你有一个移动构造函数之前,它调用了一个自动生成的赋值运算符。

现在,编译器不愿意(好吧,禁止)生成默认赋值运算符,因为您实现了移动构造函数。逻辑是,你可能更了解你的类型,所以它会让你实现

X &X::operator =(const X &)

推荐阅读