2011-02-27 19 views

Respuesta

12

No sobrecargaría operator&& o operator||. Incluso si define una clase que da lugar a un álgebra de Boole (conjuntos finitos, por ejemplo), probablemente sería una mejor opción sobrecargar operator& y operator|.

La razón es que los programadores de C++ esperan semántica especial para operator&& y operator||: son cortocircuitado, es decir, no evalúan su argumento de la derecha si no es necesario. No puede obtener este comportamiento por sobrecarga, ya que definirá una función.

Sobrecarga operator, se ha realizado en p. la biblioteca Boost.Assign. Este es también el único ejemplo de sobrecarga que sé, y nunca he considerado sobrecargarlo yo mismo. Será mejor que tengas un caso de uso muy específico donde ningún otro operador sea adecuado.

+0

buen punto. Entonces, parece que es mejor proporcionar un operador para la conversión a bool en tal caso ('operator bool()')? – davka

+0

@davka: Sí, defina 'operator bool' si su clase tiene una semántica de lógica booleana, que le da un cortocircuito de forma gratuita. Defina 'operator &' y 'operator |' si tiene semántica de álgebra booleana, como lo hacen los conjuntos finitos (donde intersección es '&', unión es '|'). –

+0

@Downvoter: por favor explique. –

4

Para sobrecargar los operadores lógicos en C++, se deben evaluar los operandos, que no es la manera en que normalmente funcionan las cosas con el cortocircuito de los tipos incorporados.

Mire el siguiente enlace.

+2

Esto no dice una palabra acerca de los operadores en cuestión. – davka

+0

Vaya. Mi error. Lo siento. Yo malinterpreté la pregunta. –

+0

@Todo: Editó la respuesta –

0

Su mala idea excepto situaciones en sus clases representa una entidad lógica, porque los operadores sobrecargados se desorientan y pueden causar nuevos errores en el código.

+0

Incluso cuando está definiendo "entidades lógicas" (álgebras booleanas), otros operadores son más adecuados. –

2

Yo diría que depende de lo que estén haciendo las sobrecargas. Por ejemplo, & & y || se espera que funcionen como condiciones lógicas, por lo que si su semántica de sobrecarga funciona de manera diferente, pueden confundir a otras personas (o incluso a usted mismo, si no las usa por un tiempo y olvida lo que hacen). Considere lo que esperaría que hicieran los operadores si no supiera cómo están sobrecargados y si sería más claro simplemente usar métodos normales.

2

Como han dicho los demás, la falta de evaluación diferida es la principal razón para evitar sobrecargar operadores lógicos.

Sin embargo, hay una muy buena razón para sobrecargarlas: Expression templates. La biblioteca Boost.Lambda hace esto, ¡y es muy útil!

3

Por lo general, es una mala idea: esos tres operadores tienen un efecto de secuencia que se pierde al sobrecargarlos. Perder ese efecto de secuencia puede causar daño al brazo (es decir, errores extraños) a aquellos que no lo esperan.

Hay casos con expresiones de plantilla donde puede mantener el efecto de secuencia, en esos casos no veo ningún problema en sobrecargarlos.

Las sobrecargas de operator, que conozco tienen otro problema: funcionan de tal manera que las aparentes cadenas de operación no son reales. Por lo general, se usan en contexto cuando no hace ninguna diferencia, pero una vez en una luna azul, esa es otra fuente de errores extraños.

3

No debe sobrecargar ningún operador de forma sorprendente.:-)

Si puede hacerlo de una manera que tenga sentido (no solo para usted), está bien hacerlo.

Como otros han dicho, los operadores lógicos son especiales ya que tienen el efecto de evaluación perezosa. Por lo tanto, sus sobrecargas probablemente deberían preservar este efecto diferido, como con las plantillas de expresión, o solo deben usarse donde las personas no esperan este efecto de todos modos.

Cuestiones relacionadas