Pregunta

Cuál es mejor:

bool MyClass::someQuery() const;

const bool MyClass::someQuery() const;

He estado usando 'const bool' desde que estoy seguro de haber escuchado que es "lo que hacen los ints". (por ejemplo, operadores de comparación) pero no puedo encontrar evidencia de eso en ningún lado, principalmente debido a que es difícil para Google e Intellisense no ayudar a ninguno;) ¿Alguien puede confirmar eso?

Para mí, devolver valores const (no se trata solo de bools) tiene más sentido; evitará que se modifiquen los temporales, lo que casi siempre será un error del programador. Solo quiero algo que lo respalde para poder elogiar la devolución de los valores constantes a mis colegas :)

¿Fue útil?

Solución

¿Entonces sabes que es correcto, justo después de la Voz de la Autoridad? La prevención de modificaciones accidentales de temporales es muy valiosa. En general, debe declarar tantas cosas como sea posible const , lo protege de una variedad de accidentes y le da al optimizador consejos útiles.

¿Tiene una copia de Scott Meyers '' Eficaz C ++ '' ¿alrededor? Apúntelos al Elemento 3 (página 18 en la tercera edición);)

Da el ejemplo de

class Rational {...};
const Rational operator* (const Rational& lhs, const Rational& rhs );

if( (a * b) = c ) // declaring operator *'s return value const causes error to be caught by compiler

Otros consejos

Este es el caso cuando const no agrega valor pero infla el código y hace que el lector piense más. ¿Cuál es el punto de este const ? La persona que llama puede copiar el valor en alguna variable no constante y hacer lo que quiera con él de todos modos.

Tenga en cuenta que if ((a * b) = c) ganó ' t compile para los tipos integrados de todos modos, por lo que es muy relevante aquí si estamos hablando de tipos integrados (su pregunta pide bool ) o tipos definidos por el usuario.

Para los tipos incorporados no tiene ningún sentido, por lo que no debe usarse. Y para los tipos definidos por el usuario, estoy en el campamento de jalf: ¿Qué sucede si la persona que llama quiere modificar el objeto devuelto?

No estoy convencido de que if ((a * b) = c) sea un argumento tan bueno para devolver tipos const definidos por el usuario, ya que no recuerdo la última vez que ' He visto un compilador not advertir sobre esto.

Para ser un poco más específico, solo "objetos" puede ser constante La definición del estándar C ++ de "objeto" incluye todo a lo que se refiere un valor (tiene un nombre) y los temporales de clase. Un valor de retorno booleano es un valor r de un tipo que no es de clase y es por eso que un compilador que cumple con los estándares simplemente ignorará " const " en este caso. Como ya han dicho otros, es inútil en este contexto.

Cuando devuelve una referencia a una variable miembro, tiene sentido hacerla constante. Aquí está devolviendo una copia, por lo tanto no hay necesidad de const.

El modificador const solo se usa para los tipos de retorno que se devuelven por referencia (ya sea como referencia const SomeObject & amp; o mediante un puntero < code> const SomeObject * ), por lo que la persona que llama no podrá modificar el objeto a través de la referencia / puntero. Los tipos primitivos se devuelven por valor , lo que significa que la persona que llama recibe una copia del objeto, no el objeto en sí.

Por lo tanto, const no es realmente apropiado para los tipos de valores devueltos. Como la copia está fuera del control de la función llamada, la función llamada no debe dictarle a la persona que llama que no se puede cambiar.

No importa por completo. Por lo tanto, el consenso es devolver solo bool .

La razón por la que no importa es que no puedes llamar a funciones de miembros no constantes de todos modos; bool no es una clase o estructura.

Como se va a copiar bool, es lo mismo, poner constante o no. Además, puede tener algunos problemas de compilación.

tipo de retorno de const

  

RESUMEN:

     

El valor de un tipo de retorno que es   Const declarado no se puede cambiar. Esta   es especialmente útil cuando se da un   referencia a las partes internas de una clase, pero   También puede evitar errores más raros.

const bool func();
bool f = func();

0 errores, 0 advertencias. ¿Qué ha logrado aparte de la inflación innecesaria del código?

Esta es una publicación antigua, pero creo que vale la pena mencionar que existe un posible caso de esquina aquí desde C ++ 11. Si bien, como lo han dicho otros, no habrá diferencia si usa const bool o bool como tipo de retorno en la mayoría de los casos, si está usando C ++ 11 decltype y asociados, p. ej. result_of , puede declarar una variable con el mismo tipo que el valor de retorno de alguna función, por lo que const realmente tendría un efecto en este caso.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top