重载逻辑运算符被视为不良做法?

时间:2011-02-27 12:05:47

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

重载&&,||是一个坏主意或逗号运算符和为什么?

7 个答案:

答案 0 :(得分:13)

我不会超载operator&&operator||。即使您定义了一个产生布尔代数的类(例如,有限集),它也可能是重载operator&operator|的更好选择。

原因是C ++程序员期望operator&&operator||的特殊语义:它们短路,即如果没有,则不评估它们的右手参数必要。你不能通过重载来获得这种行为,因为你将定义一个函数。

重载operator,已在例如Boost.Assign库。{这也是我所知道的超载的唯一例子,我自己从未考虑过载。你最好有一个非常具体的用例,没有其他操作符适合。

答案 1 :(得分:4)

为了在C ++中重载逻辑运算符,必​​须对操作数进行求值,这不是通常用于内置类型短路的方法。

请看下面的链接。

答案 2 :(得分:3)

这通常是一个坏主意:这三个运算符具有排序效果,当您重载它们时会丢失。失去那种测序效果会导致手臂(即奇怪的虫子)对那些不期望丢失的人产生影响。

在某些情况下,模板表达式可以保持顺序效果,在这种情况下,我认为重载它们没有问题。

我所知道的operator,的重载有另一个问题:它们的工作方式使得明显的操作链不是真正的操作链。通常情况下,它们在没有区别的情况下被用于上下文中,但是在蓝色的月亮中,这是一个奇怪的错误的另一个来源。

答案 3 :(得分:3)

您不应该以令人惊讶的方式超载任何运算符。 :-)

如果你能以一种有意义的方式(不仅对你而言)这样做,那么这样做是可以的。

像其他人所说的那样,逻辑运算符的特殊之处在于它们具有惰性求值的效果。所以你的重载可能应该保留这种惰性效果,就像使用表达式模板一样,或者仅在人们不期望这种效果的地方使用。

答案 4 :(得分:2)

我会说这取决于你的重载正在做什么。例如,&&和||期望作为逻辑条件工作,所以如果你的重载语义以不同的方式工作,它们可能会混淆其他人(甚至你自己,如果你暂时不使用它们而忘记他们做了什么)。考虑一下,如果您不知道它们是如何过载的话,您会期望操作员做什么,以及更简单地使用普通方法。

答案 5 :(得分:2)

正如其他人所说,缺少懒惰评估是避免逻辑运算符过载的主要原因。

然而,有一个很好的理由让它们超载:Expression templates。 Boost.Lambda库就是这样做的,它非常有用!

答案 6 :(得分:0)

除了你的类代表某个逻辑实体的情况之外,它的坏主意,因为重载的运算符会迷失方向,并且可能导致代码中出现新的错误。