【发布时间】:2019-10-13 18:25:10
【问题描述】:
我想正常地重载一个常见的复制赋值运算符。 起初我使用了一个只需要对源代码进行 const 引用的接口, 并明确禁用接受可修改引用的接口, 但我无法通过编译。 编译器报“error: use of deleted function ‘ClassA& ClassA::operator=(ClassA&)”
当然,如果我不明确删除接口,我可以编译,但这不是我的目的。 我想明确删除它,以避免意外使用它。
为什么复制赋值操作需要对源的可修改引用,而不是 const 引用? 赋值操作只需要只读访问源即可!
关于复制构造函数有一个相同的问题,为了简化,我省略了它。
我的代码有什么问题?或者我们不能删除它?
我的示例代码如下:
class ClassA {
public:
ClassA() = default;
ClassA( ClassA & ) = default;
ClassA & operator=( ClassA & )
= delete // Must comment-out this, or we can't pass the compilation.
// { cout << "ClassA & operator=( ClassA & ) executed." << endl; return *this; }
;
ClassA & operator=( ClassA && ) {
cout << "ClassA & operator=( ClassA && ) executed." << endl;
return *this;
};
ClassA & operator=( const ClassA & ) {
cout << "ClassA & operator=( const ClassA & ) executed." << endl;
return *this;
};
ClassA & operator=( const ClassA && ) {
cout << "ClassA & operator=( const ClassA && ) executed." << endl;
return *this;
};
};
int main() {
ClassA oa, ob;
ob = oa;
return EXIT_SUCCESS;
};
【问题讨论】:
-
你为什么需要它?为什么改变自己会改变另一个实例?
-
由于右值引用的性质,接受
const右值引用毫无意义。 -
你需要下定决心。要么使用
ClassA &operator=(const ClassA &) = delete,它会阻止编译器生成operator=(),这意味着类没有,或者你定义并实现运算符。这两个概念是相互排斥的。你不能指望显式删除一个操作符,然后显式实现它。
标签: c++ gcc const-reference copy-assignment move-assignment-operator