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?

Foi útil?

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;
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top