为什么我不能用非引用返回类型定义operator =?

时间:2011-05-23 17:56:22

标签: c++ operators operator-overloading operator-precedence

运算符=在C ++中的类中声明如下:

 MyType & operator=(const MyType & rhs);

有理由认为链接是必要的。但是,由于operator =具有正确的优先级,因此返回该值应该足够了。

5 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:0)

如果不按引用返回,则按值返回,并且无法分配值,因为只能分配左值。即使你可以,也没关系,因为你指定的对象在你分配给它后很快就会被销毁,因为它只是对象的副本,而不是对象本身。

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

int blah() { int blah = 5; return blah; }
blah() = 99;

你可以看到的显然是错误的。

它确实取决于你进行作业的顺序,因为只有当你改变作业的自然顺序时才会出现这个问题,因为左边的一个发生在右边的一个之前,就像Oli在评论中的例子一样在这个答案:

(a = b) = c

另一个原因是消除了不必要的复制,尽管编译器优化可能会带来这种好处。

您可以在此处阅读有关左值和右值的更多信息:http://msdn.microsoft.com/en-us/library/bkbs2cds.aspx

答案 2 :(得分:0)

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

此外,您还必须考虑您的班级是否准备好复制。

答案 3 :(得分:0)

您可以按价值返回,没有什么可以阻止您。 “链接”人员引用的是(a = b) = c之类的语句,其效果是将b分配给a,然后将c分配给a。这几乎没有实际用途,所以如果你选择按价值回报那就完全没问题了。

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

答案 4 :(得分:0)

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

不要太聪明:)