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)
您只能定义一个或另一个,但不能同时定义两者.
不要那样做.它阻止客户编写如下内容:
(a = b).non_const_method();
Run Code Online (Sandbox Code Playgroud)
而不是更长的形式:
a = b;
a.non_const_method();
Run Code Online (Sandbox Code Playgroud)
虽然您可能不喜欢速记风格,但是由库的用户来决定他们想要如何编写代码.
一个反映了 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。但也许我错过了一些东西......