有没有人发现需要声明复制赋值运算符const的返回参数?

Kei*_*ith 11 c++ assignment-operator

复制赋值运算符具有通常的签名:

    my_class & operator = (my_class const & rhs);
Run Code Online (Sandbox Code Playgroud)

以下签名是否有实际用途?

    my_class const & operator = (my_class const & rhs);
Run Code Online (Sandbox Code Playgroud)

您只能定义一个或另一个,但不能同时定义两者.

CB *_*ley 20

使复制赋值的返回类型成为非const引用的主要原因是它是标准中"可分配"的要求.

如果您将返回类型作为const引用,则您的类将无法满足在任何标准库容器中使用的要求.


R S*_*hko 7

不要那样做.它阻止客户编写如下内容:

(a = b).non_const_method();
Run Code Online (Sandbox Code Playgroud)

而不是更长的形式:

a = b;
a.non_const_method();
Run Code Online (Sandbox Code Playgroud)

虽然您可能不喜欢速记风格,但是由库的用户来决定他们想要如何编写代码.

  • @willhelmtell - `operator =`返回const仍然允许`a = b = c;`但是会阻止`(a = b)= c;` (3认同)
  • @R Samuel Klatchko:我想你是对的......那就是说 - 我用'const =()来表示非const&return,但是如果我有一点担心这样的结果会被危险地用在某种程度上我'有一个类返回一个`const&`代替,让用户生活不方便无法链接运算符的某些方法调用.这可能有点懒惰或偏执,但我会对此作出规定. (2认同)

Mic*_*urr 5

一个反映了 C++ 中重载赋值运算符的答案:

返回 aconst&仍将允许分配链接:

a = b = c;
Run Code Online (Sandbox Code Playgroud)

但会禁止一些更不寻常的用途:

(a = b) = c;
Run Code Online (Sandbox Code Playgroud)

请注意,这使得赋值运算符的语义类似于它在 C 中的语义,其中=运算符返回的值不是左值。在 C++ 中,标准对其进行了更改,因此=运算符返回左操作数的类型,因此结果是左值。但是正如史蒂夫杰索普在对另一个答案的评论中指出的那样,虽然这使得编译器会接受

(a = b) = c;
Run Code Online (Sandbox Code Playgroud)

即使对于内置函数,结果也是内置函数的未定义行为,因为a在没有中间序列点的情况下修改了两次。对于带有 an 的非内置函数,可以避免该问题,operator=()因为operator=()函数调用充当序列点。

我认为返回 a 没有问题,const&除非您想特别允许左值语义(并设计类以确保它对这些语义合理地起作用)。如果您的用户想要对 的结果做一些不寻常的事情operator=(),我宁愿该类禁止它,而不是希望它偶然而不是设计正确。

还。请注意,虽然您说:

您只能定义其中之一,但不能同时定义两者。

那是因为 C++ 中的函数签名没有考虑返回值类型。但是,您可以有多个operator=()赋值运算符,它们采用不同的参数并返回适合参数类型的不同类型:

my_class& operator=( my_class& rhs);
my_class const& operator=(my_class const& rhs);
Run Code Online (Sandbox Code Playgroud)

我不完全确定这会给你带来什么。分配给的对象(大概是返回的引用)在这两种情况下都是非常量的,因此没有逻辑上的理由const&仅仅因为=is的右侧就返回 a const。但也许我错过了一些东西......