重载&&,||是一个坏主意或逗号运算符和为什么?
答案 0 :(得分:13)
我不会超载operator&&
或operator||
。即使您定义了一个产生布尔代数的类(例如,有限集),它也可能是重载operator&
和operator|
的更好选择。
原因是C ++程序员期望operator&&
和operator||
的特殊语义:它们短路,即如果没有,则不评估它们的右手参数必要。你不能通过重载来获得这种行为,因为你将定义一个函数。
重载operator,
已在例如Boost.Assign库。{这也是我所知道的超载的唯一例子,我自己从未考虑过载。你最好有一个非常具体的用例,没有其他操作符适合。
答案 1 :(得分:4)
答案 2 :(得分:3)
这通常是一个坏主意:这三个运算符具有排序效果,当您重载它们时会丢失。失去那种测序效果会导致手臂(即奇怪的虫子)对那些不期望丢失的人产生影响。
在某些情况下,模板表达式可以保持顺序效果,在这种情况下,我认为重载它们没有问题。
我所知道的operator,
的重载有另一个问题:它们的工作方式使得明显的操作链不是真正的操作链。通常情况下,它们在没有区别的情况下被用于上下文中,但是在蓝色的月亮中,这是一个奇怪的错误的另一个来源。
答案 3 :(得分:3)
您不应该以令人惊讶的方式超载任何运算符。 :-)
如果你能以一种有意义的方式(不仅对你而言)这样做,那么这样做是可以的。
像其他人所说的那样,逻辑运算符的特殊之处在于它们具有惰性求值的效果。所以你的重载可能应该保留这种惰性效果,就像使用表达式模板一样,或者仅在人们不期望这种效果的地方使用。答案 4 :(得分:2)
我会说这取决于你的重载正在做什么。例如,&&和||期望作为逻辑条件工作,所以如果你的重载语义以不同的方式工作,它们可能会混淆其他人(甚至你自己,如果你暂时不使用它们而忘记他们做了什么)。考虑一下,如果您不知道它们是如何过载的话,您会期望操作员做什么,以及更简单地使用普通方法。
答案 5 :(得分:2)
正如其他人所说,缺少懒惰评估是避免逻辑运算符过载的主要原因。
然而,有一个很好的理由让它们超载:Expression templates。 Boost.Lambda库就是这样做的,它非常有用!
答案 6 :(得分:0)
除了你的类代表某个逻辑实体的情况之外,它的坏主意,因为重载的运算符会迷失方向,并且可能导致代码中出现新的错误。