提问人:potter john 提问时间:4/17/2022 最后编辑:potter john 更新时间:4/18/2022 访问量:306
如果删除运算符,则已删除运算符的返回类型是否重要?
Does the return type of a deleted operator matter if the operator is deleted?
问:
我正在阅读“C++ 并发在行动中”,其中一页讨论复制分配运算符 =delete。
我已经用谷歌搜索了它(删除复制构造函数和复制赋值运算符。其中哪些是必不可少的?并自己尝试了一些代码。
我想知道两者之间是否有区别
void operator= (const MyClass&) = delete;
和
MyClass& operator= (const MyClass&) = delete;
或者我可以做
void operator= (MyClass) = delete;
无论如何,它似乎都会“删除”...operator =
我刚刚检查了有关 Copy 构造函数和 Copy 赋值运算符 (https://en.cppreference.com/w/cpp/language/copy_constructor)(https://en.cppreference.com/w/cpp/language/copy_assignment) cppreference.com。
我可以只使用以下代码吗?
MyClass(MyClass&)=delete;
void operator= (MyClass) = delete;
我认为无论如何它都会“删除”所有内容,所以我不需要担心复制的“性能”,对吧?...
答:
0赞
MisaghM
4/17/2022
#1
C++ 允许您使用所需的任何返回类型的运算符。
在所有情况下,您都在使用不同的语义重载,因此它们都可以工作。
但最好遵循返回类引用的普遍约定,以便赋值链 () 和构造(如 ())也可以工作。operator=
a = b = c
while ((a = b) == c) {...
你写的第二种方式:
MyClass& operator=(const MyClass&) = delete;
最常用,并且如所写,不需要命名参数。
评论
0赞
StoryTeller - Unslander Monica
4/17/2022
如果删除运算符,这条链将如何“工作”?
1赞
MisaghM
4/17/2022
@StoryTeller-UnslanderMonica:不应该。我只是说,如果它被删除,operator= 的语义是什么并不重要,所以不妨遵循约定,然后解释为什么这是约定。这个问题的标题似乎也被编辑过了,所以也许这就是为什么我的答案听起来不那么清楚。
0赞
potter john
4/18/2022
是的,我的原标题是我糟糕的英语写的......所以它被改了几步......我还想知道我是否只是想节省我的输入代码时间并保持我的代码简洁,我可以只使用吗?它会做和第二种方式一样的工作,对吧?void operator= (MyClass) = delete;
0赞
MisaghM
4/18/2022
无需担心性能,因为一旦删除了运算符,就不会进行复制,所有删除都是一样的。节省编码时间并不总是最佳选择。习惯了 C++ 的人希望赋值运算符以传统形式编写,看到它返回 void 看起来是不对的。该参数可能是也可能不是常量引用,具体取决于类。对于复制和交换惯用语,运算符的参数通常按值传递。
评论
MyClass& operator= (const MyClass&) = delete;
void