重载 &&、|| 或逗号运算符是个不好的主意吗?为什么?
重载 &&、|| 或逗号运算符是个不好的主意吗?为什么?
我不建议过度使用operator&&
或operator||
。即使您定义了一个产生布尔代数的类(例如有限集合),重载operator&
和operator|
可能是更好的选择。
原因是C++程序员期望 operator&&
和operator||
具有特殊语义:它们是短路的,也就是说如果不必要则不会评估其右侧参数。通过重载无法实现此行为,因为这将定义一个函数。
在例如Boost.Assign库中已经重载了operator,
。这也是我知道的唯一的重载示例,我甚至从未考虑过自己进行重载。最好在没有其他运算符适用的情况下使用非常特定的用例。
operator bool()
)似乎更好? - davkaoperator bool
可以为你提供免费的短路。如果它具有布尔代数语义,例如有限集合(其中交集是&
,并集是|
),则定义operator&
和operator |
。 - Fred Foooperator,
的重载还存在另一个问题:它们的工作方式使得表面上的操作链不是真正的操作链。通常情况下,它们用在一些上下文中时并没有什么区别,但是偶尔也会成为引发奇怪错误的源头之一。不应该以令人惊讶的方式重载任何运算符。:-)
如果你能以有意义的方式完成它(不仅对你自己),那就可以这样做。
像其他人所说,逻辑运算符是特殊的,因为它们具有惰性求值的效果。因此,你的重载应该保留这种惰性效果,例如使用表达式模板,或者只在人们不期望这种效果的地方使用。
我认为这取决于你的重载函数是做什么的。例如,&&和||预期将作为逻辑条件工作,因此如果您的重载语义有所不同,则可能会使其他人困惑(甚至是您自己,如果您不使用它们一段时间并忘记了它们的功能)。考虑一下,如果你不知道它们被重载后会执行什么操作,是否更清晰地使用普通方法。
除非您的类表示某些逻辑实体,否则重载运算符是一个不好的想法,因为它们会使人迷惑并可能在代码中引入新的错误。