c++ - 为什么 GCC 在复制赋值操作中拒绝 const 引用?
问题描述
我想正常重载一个常见的复制赋值运算符。一开始我使用了一个只需要对源进行 const 引用的接口,并显式禁用了接受可修改引用的接口,但我无法通过编译。编译器报告“错误:使用已删除的函数 '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;
};
解决方案
或者我们不能删除它?
你只是不需要这样做。如果您提供用户定义的复制赋值运算符,则不会隐式声明其他运算符,即仅存在用户定义的运算符。
如果这样做,您明确标记为的复制赋值运算符delete
将参与重载决议;当它被选中时,编译失败。对于ob = oa;
,operator=( ClassA & )
是更好的匹配,如果不存在,operator=( const ClassA & )
将被使用并正常工作。
所以在这种情况下你可以做
class ClassA {
public:
ClassA & operator=( ClassA && ) {
cout << "ClassA & operator=( ClassA && ) executed." << endl;
return *this;
}
ClassA & operator=( const ClassA & ) {
cout << "ClassA & operator=( const ClassA & ) executed." << endl;
return *this;
}
};
推荐阅读
- c# - 创建的文本文件中缺少数据结尾
- c# - 如何从 C# 中的另一个类访问类?
- laravel - 如何将插槽/数据传递给惯性布局组件
- php - 使用 Dialogflow PHP 客户端库设置 Dialogflow 意图
- python - 获取脚本所在的行
- c++ - Magick++ 和 CMake 的未定义引用错误
- express - express 发布到 heroku 但需要 .env
- java - Java中的FIFO队列
- php - $_GET 从 URL 抓取变量,但 POST 不发布到 Sendy API
- python - 如何在python中将一般格式的MS Excel数字(例如43390)转换为日期