为什么我能';t定义运算符=具有非引用返回类型? 运算符= C++中,类内部声明如下: MyType & operator=(const MyType & rhs);

为什么我能';t定义运算符=具有非引用返回类型? 运算符= C++中,类内部声明如下: MyType & operator=(const MyType & rhs);,c++,operators,operator-overloading,operator-precedence,C++,Operators,Operator Overloading,Operator Precedence,这是合理的,就像是链接所必需的。但是,由于operator=具有正确的优先级,那么返回值就足够了。如果不通过引用返回,则是通过值返回,并且不能赋值,因为只有左值才是可赋值的。即使可以,也没关系,因为分配给它的对象会在分配给它后很快被销毁,因为它只是对象的副本,而不是对象本身 实际上,您正在尝试这样做: int blah() { int blah = 5; return blah; } blah() = 99; 正如你所看到的,这显然是错误的 但这取决于你做作业的顺序,因为只有当你改变作业的自然

这是合理的,就像是链接所必需的。但是,由于operator=具有正确的优先级,那么返回值就足够了。

如果不通过引用返回,则是通过值返回,并且不能赋值,因为只有左值才是可赋值的。即使可以,也没关系,因为分配给它的对象会在分配给它后很快被销毁,因为它只是对象的副本,而不是对象本身

实际上,您正在尝试这样做:

int blah() { int blah = 5; return blah; }
blah() = 99;
正如你所看到的,这显然是错误的

但这取决于你做作业的顺序,因为只有当你改变作业的自然顺序,让一个在左边,一个在右边,这个问题才会出现,就像奥利在对这个答案的评论中的例子:

(a = b) = c
另一个原因是消除不必要的复制,尽管编译器优化可能会剥夺这一好处


您可以在此处阅读关于左值和右值的更多信息:

如果您不通过引用返回,那么您是通过值返回的,并且您不能分配给值,因为只有左值是可分配的。即使可以,也没关系,因为分配给它的对象会在分配给它后很快被销毁,因为它只是对象的副本,而不是对象本身

实际上,您正在尝试这样做:

int blah() { int blah = 5; return blah; }
blah() = 99;
正如你所看到的,这显然是错误的

但这取决于你做作业的顺序,因为只有当你改变作业的自然顺序,让一个在左边,一个在右边,这个问题才会出现,就像奥利在对这个答案的评论中的例子:

(a = b) = c
另一个原因是消除不必要的复制,尽管编译器优化可能会剥夺这一好处


您可以在此处阅读有关左值和右值的更多信息:

是的,但原因可能与优先级无关。返回引用而不是值的原因与将rhs(在您的示例中)作为常量引用而不是值传递的原因相同:性能更好。因此,如果需要,只能返回值,但要考虑到可能会创建副本


你还必须考虑到你的课程是否准备好复制。

是的,但原因可能与优先级无关。返回引用而不是值的原因与将rhs(在您的示例中)作为常量引用而不是值传递的原因相同:性能更好。因此,如果需要,只能返回值,但要考虑到可能会创建副本


您还必须考虑您的类是否准备好复制。

您当然可以使用非引用返回类型声明
运算符=
。事实上,在我实现它的极少数情况下,我通常会让它返回
void
,因为我不认为多个赋值或测试赋值结果是C++最大的特性之一。

您当然可以使用非引用返回类型声明
操作符=
。事实上,在我实现它的极少数情况下,我通常会让它返回
void
,因为我不认为多个赋值或测试赋值结果是C++最大的特性之一。

您可以按值返回,没有什么可以阻止您。人们所指的“链接”是像
(a=b)=c
这样的语句,其作用是将
b
分配给
a
,然后将
c
分配给
a
。这几乎没有实际用途,所以如果您选择按值返回,这是非常好的


当前的状态来自这样一个事实,即对于原语,赋值就是这样定义的。因此,编译器提供的赋值运算符的工作方式是相同的,通常您希望重载运算符尽可能像其内置的运算符那样工作。然而,在这种特殊情况下,考虑到特定构造的相对模糊性,您不太可能通过改变这种行为来混淆任何人。只要你没有做一些完全出乎意料的事情,比如返回一个布尔值来指示赋值是否成功,那就不重要了。

你可以按值返回,没有什么可以阻止你。人们所指的“链接”是像
(a=b)=c
这样的语句,其作用是将
b
分配给
a
,然后将
c
分配给
a
。这几乎没有实际用途,所以如果您选择按值返回,这是非常好的


当前的状态来自这样一个事实,即对于原语,赋值就是这样定义的。因此,编译器提供的赋值运算符的工作方式是相同的,通常您希望重载运算符尽可能像其内置的运算符那样工作。然而,在这种特殊情况下,考虑到特定构造的相对模糊性,您不太可能通过改变这种行为来混淆任何人。只要你没有做一些完全出乎意料的事情,比如返回一个布尔值来指示赋值是否成功,那就不重要了。

我发现最好让编译器自动生成运算符=()。在您确实需要指定它的情况下(最有可能是深度拷贝),我不会对它做任何非标准的事情。这只会让其他开发人员感到困惑


不要太聪明:)

我发现最好让编译器自动生成运算符=()。在您确实需要指定它的情况下(最有可能是深度拷贝),我不会对它做任何非标准的事情。这只会让其他开发人员感到困惑


不要太聪明:)

这个问题写在问题标题中:为什么我不能用非引用返回定义operator=