运算符=在C ++中的类中声明如下:
MyType & operator=(const MyType & rhs);
有理由认为链接是必要的。但是,由于operator =具有正确的优先级,因此返回该值应该足够了。
答案 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 =()。在你确实需要指定它的情况下(对于最有可能的深拷贝),我不会做任何非标准的事情。这只会让其他开发者感到困惑。
不要太聪明:)