gpt4 book ai didi

c++ - 为什么 GCC 拒绝复制赋值操作中的 const 引用?

转载 作者:太空宇宙 更新时间:2023-11-03 10:38:03 24 4
gpt4 key购买 nike

我想正常重载一个普通的复制赋值运算符。起初我使用了一个只需要对源代码进行常量引用的接口(interface),并明确禁用接受可修改引用的接口(interface),但我无法通过编译。编译器报“error: use of deleted function ‘ClassA& ClassA::operator=(ClassA&)”

当然,如果我不明确删除接口(interface),我可以编译,但这不是我的目的。我想明确删除它,以避免意外使用它。

为什么复制赋值操作需要对源的可修改引用,而不是 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;
};

最佳答案

or we can NOT delete it?

您只是不需要那样做。如果您提供用户定义的复制赋值运算符,则不会有其他的 implicitly-declared ,即只有用户定义的存在。

如果这样做,您明确标记为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++ - 为什么 GCC 拒绝复制赋值操作中的 const 引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56338569/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com