为什么我不能用非引用返回类型定义运算符=?
Why I can't define operator= with non-reference return type?
在C++中,类内部的运算符被声明为:
MyType & operator=(const MyType & rhs);
它是合理的,就像它是链接所必需的。但是,由于运算符=具有正确的优先级,那么返回值就足够了。
您当然可以用非引用返回类型声明operator =
。事实上,在我实现它的极少数情况下,我通常会让它返回void
,因为我不认为多个赋值或测试赋值结果是C++最大的特性之一。
此外,你还必须考虑到你的课是否准备好了复印件。
如果不通过引用返回,则通过值返回,并且不能赋值,因为只有lvalue是可赋值的。即使你可以,这也没关系,因为你分配给的对象在你分配给它后不久就会被销毁,因为它只是对象的副本,而不是对象本身。
实际上,你正试图做到这一点:
int blah() { int blah = 5; return blah; }
blah() = 99;
正如你所看到的,这显然是错误的。
不过,这确实取决于你做作业的顺序,因为只有当你改变作业的自然顺序,让左边的作业发生在右边的作业之前,这个问题才会出现,就像Oli在评论这个答案时的例子:
(a = b) = c
另一个原因是消除了不必要的复制,尽管编译器优化可能会剥夺这一好处。
你可以在这里阅读更多关于左值和右值的信息:http://msdn.microsoft.com/en-us/library/bkbs2cds.aspx
您可以按值返回,没有什么可以阻止您。人们所指的"链接"是像(a = b) = c
这样的语句,其效果是将b
分配给a
,然后将c
分配给a
。这几乎没有实际用途,所以如果你选择按值返回,那就太好了。
当前的状况来自于这样一个事实,即对于原语,赋值是以这种方式定义的。因此,编译器提供的赋值运算符的工作方式是相同的,通常情况下,您希望重载运算符尽可能像内置运算符一样工作。然而,在这种特殊的情况下,考虑到该特定构造的相对模糊性,您不太可能通过改变该行为来混淆任何人。只要你没有做一些完全出乎意料的事情,比如返回一个布尔值来指示赋值是否成功,这应该无关紧要。
我发现最好让编译器自动生成运算符=()。如果你确实需要指定它(很可能是深度复制),我不会对它做任何非标准的操作。这只会让其他开发人员感到困惑。
不要太聪明:)
- 在 C++ 的自定义运算符中删除与删除[](不同于常见的删除与删除[]问题)
- 自定义运算符重载C++,无开销
- 如何为缺少预定义运算符而不扩展命名空间"std"的标准类型定义运算符>> (istream &, ...)?
- 如何使用C++将MXNET自定义运算符构建到单独的库/包中?
- 模板类的用户定义运算符上的 C++ 隐式转换
- 什么是编程语言支持定义您自己的自定义运算符?
- 如何在Qt中为矩阵类定义[ ][ ]运算符?
- 在 c++ 迭代器中,我应该同时定义运算符== 和运算符!=吗?
- 在 rxcpp 中创建自定义运算符
- 错误 C2676;在C++的二叉搜索树类中定义 ++ 运算符时遇到问题
- std::map :使用自定义运算符时更新密钥
- 最初定义运算符C++在哪里
- 如何在Tensorflow Lite中添加自定义运算符
- 如何在 rxcpp 自定义运算符中正确推断泛型
- 在模板化类之外定义运算符重载
- 为类定义之外的模板类定义运算符[]()(数组订阅)
- 是否可以在类定义之外定义运算符[]()(数组订阅)
- C++ 重新定义运算符<() 和运算符!=()
- 如何将上下文信息传递给自定义运算符<<适用于 std::iostream
- 无法在C++中定义++运算符,这里有什么问题?