const_cast vs static_cast
-
25-09-2019 - |
Pergunta
Adicionar const
Para um objeto que não é consagrado, qual é o método preferido? const_cast<T>
ou static_cast<T>
. Em uma pergunta recente, alguém mencionou que prefere usar static_cast
, mas eu teria pensado que const_cast
tornaria a intenção do código mais clara. Então, qual é o argumento para usar static_cast
Para fazer uma variável const?
Solução
Também não use. Inicialize uma referência const que se refere ao objeto:
T x;
const T& xref(x);
x.f(); // calls non-const overload
xref.f(); // calls const overload
Ou use um implicit_cast
modelo de função, como o fornecido em impulso:
T x;
x.f(); // calls non-const overload
implicit_cast<const T&>(x).f(); // calls const overload
Dada a escolha entre static_cast
e const_cast
, static_cast
é definitivamente preferível: const_cast
só deve ser usado para náufrago constência porque é o único elenco que pode fazê -lo, e a consistência para fora é inerentemente perigosa. Modificar um objeto por meio de um ponteiro ou referência obtido pela consistência para fora pode resultar em comportamento indefinido.
Outras dicas
eu diria static_cast
é preferível, pois só permitirá que você seja lançado de nãoconst
para const
(que é seguro), e não na outra direção (que não é necessariamente segura).
Este é um bom caso de uso para um implícito_cast modelo de função.
Você poderia escrever seu próprio elenco:
template<class T>
const T & MakeConst(const T & inValue)
{
return inValue;
}