Devo retornar bool ou bool const?
-
22-07-2019 - |
Pergunta
O que é melhor:
bool MyClass::someQuery() const;
const bool MyClass::someQuery() const;
Eu tenho usado 'const bool' desde que eu tenho certeza que eu lembro de ouvir que é "o que os ints fazer" (por exemplo, operadores de comparação), mas não consigo encontrar evidências de que em qualquer lugar, principalmente devido ao facto de ser difícil ao Google e Intellisense não ajudar qualquer;?) alguém pode confirmar que
Para mim retornando valores const (este não é apenas sobre bools) faz mais sentido; ele vai evitar temporários sendo modificado, que é quase sempre vai ser um erro do programador. Eu só quero alguma coisa para sustentar isso para que eu possa exaltar retornando valores const aos meus colegas:)
Solução
Assim que você sabe que está certo, você está apenas após a voz de autoridade?
Prevenir modificação acidental de temporários é muito valioso. Em geral, você deve declarar tantas coisas quanto você possivelmente pode const
, protege-lo de uma variedade de acidentes e dá as dicas úteis Optimiser.
D'você tem uma cópia de Scott Meyers' "Effective C ++" por aí? Apontá-los no ponto 3 (página 18 na terceira edição);)
Ela dá o exemplo 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
Outras dicas
Este é o caso quando const
não agrega valor, mas infla o código e faz o leitor pensar mais. Qual é o ponto deste const
? O chamador pode copiar o valor em alguma variável não-const e fazer o que quiser com ele de qualquer maneira.
Note que if((a*b) = c)
não irá compilar para tipos built-in de qualquer maneira, por isso é muito relevante aqui se estamos falando de tipos built-in (sua pergunta pede bool
) ou tipos definidos pelo usuário.
Para built-in tipos não faz sentido em tudo, por isso não deve ser usado. E para tipos definidos pelo usuário, eu estou no campo de jalf de: E se o autor da chamada quer para modificar o objeto retornado?
Eu não estou convencido de que if((a*b) = c)
é como um argumento bom para retornar tipos definidos pelo usuário const, desde que eu não me lembro a última vez que eu vi um compilador não avisar sobre isso.
Para ser um pouco mais específico, apenas "objetos" pode ser const. A definição padrão C ++ da de "objecto" inclui tudo um Ivalue refere-se a ( "tem um nome") e do tipo classe temporários. Um valor de retorno boolean é um rvalue de um tipo não-classe que é por isso que um compilador compatível com os padrões irá simplesmente ignorar "const" neste caso. Como outros já disse, é inútil neste contexto.
Quando você retornar uma referência a uma variável de membro faz sentido fazê-lo const. Aqui você está retornando uma cópia, portanto, não há necessidade de const.
O const
modificador é usado apenas para tipos de retorno que são devolvidos por referência (quer como const SomeObject&
de referência ou por meio de um ponteiro const SomeObject*
), de modo que o chamador não irá ser capaz de modificar o objecto através do referência / apontador. tipos primitivos são devolvidos por valor , o que significa que o chamador recebe um cópia do objeto, não o objeto em si.
Portanto, const
não é realmente apropriado para tipos de valor devolvidos. Desde a cópia está fora do controle da função chamada, a função chamada não deve ditar ao chamador que não pode ser alterado.
É completamente não importa. Portanto, o consenso é retornar apenas bool
.
A razão que não importa é que você não pode chamar funções de membro não-const de qualquer maneira; bool
não é uma classe ou struct.
Como bool vai ser copiado, é o mesmo, para colocar const ou não. Além disso, você vai pode ter alguns problemas Compil.
RESUMO:
O valor de um tipo de retorno que é const declarou não pode ser alterado. este é especialmente útil ao dar um referência para internos de uma classe, mas também pode evitar erros mais raros.
const bool func();
bool f = func();
0 erros, avisos 0. O que você tem feito outra do que a inflação código desnecessário?
Este é um posto antiga, mas acho que vale a pena mencionar que há um caso de canto potencial aqui desde C ++ 11. Embora, como dito por outros, ele vai fazer nenhuma diferença se você usa const bool
ou bool
como tipo de retorno na maioria dos casos, se você estiver usando C ++ 11 decltype
e associados, por exemplo, result_of
, você pode declarar uma variável com o mesmo tipo como o valor retorno de alguma função, e assim o const
seria realmente ter um efeito neste caso.