重载 &&, || 是不是一个坏主意 或逗号运算符,为什么?
7 回答
我不会超载operator&&
或operator||
。operator&
即使您定义了一个产生布尔代数的类(例如有限集),重载和可能是一个更好的选择operator|
。
原因是 C++ 程序员期望operator&&
and有特殊的语义operator||
:它们是短路的,即如果没有必要,不计算它们的右手参数。您无法通过重载来获得此行为,因为您将定义一个函数。
重载operator,
已经在例如Boost.Assign库中完成。这也是我所知道的唯一一个重载的例子,我什至从来没有考虑过自己重载它。你最好有一个非常具体的用例,没有其他运算符适合。
这通常是一个坏主意:这三个运算符具有排序效果,当您重载它们时就会丢失。失去这种排序效果可能会导致那些没想到会丢失的人(即奇怪的错误)。
在模板表达式的某些情况下,您可以保持排序效果,在这些情况下,我认为重载它们没有问题。
我知道的重载operator,
还有另一个问题:它们的工作方式使得明显的操作链不是真实的。通常,它们在没有区别的情况下在上下文中使用,但是一旦在蓝月亮中,那是奇怪错误的另一个来源。
You shouldn't overload any operators in a way that is surprising. :-)
If you can do it in a way that makes sense (not only to you), it is fine to do so.
Like others have said, the logical operators are special in that they have the effect of lazy evaluation. So your overloads should probably preserve this lazy effect, like with expression templates, or only be used where people don't expect this effect anyway.
我会说这取决于你的重载在做什么。例如,&& 和 || 预计将作为逻辑条件工作,因此如果您的重载语义以某种方式工作,它们可能会混淆其他人(甚至您自己,如果您有一段时间不使用它们而忘记了它们的作用)。考虑一下如果您不知道它们是如何重载的,并且如果只使用普通方法会更清楚,那么您希望运算符做什么。
正如其他人所说,缺少惰性求值是避免重载逻辑运算符的主要原因。
但是,重载它们有一个很好的理由:表达式模板。Boost.Lambda 库就是这样做的,它非常有用!
除非您的类表示某些逻辑实体,否则这是个坏主意,因为重载的运算符会迷失方向并可能导致代码中的新错误。