const_cast vs static_cast
-
25-09-2019 - |
Domanda
Per aggiungere const
ad un oggetto non const, che è il metodo preferito? const_cast<T>
o static_cast<T>
. In una recente domanda, qualcuno ha detto che essi preferiscono usare static_cast
, ma mi avrebbe mai pensato che const_cast
renderebbe l'intenzione del codice più chiaro. Allora, qual è l'argomento per l'utilizzo di static_cast
per fare un const variabile?
Soluzione
Non utilizzare uno. Inizializzare un riferimento const che fa riferimento all'oggetto:
T x;
const T& xref(x);
x.f(); // calls non-const overload
xref.f(); // calls const overload
In alternativa, utilizzare un modello di funzione implicit_cast
, come quello fornito in Boost :
T x;
x.f(); // calls non-const overload
implicit_cast<const T&>(x).f(); // calls const overload
Data la scelta tra static_cast
e const_cast
, static_cast
è sicuramente da preferire: const_cast
deve essere utilizzato solo per gettati via costanza, perché è l'unico cast che può farlo, e gettando via constness è intrinsecamente pericolosa . Modifica di un oggetto tramite un puntatore o riferimento ottenuto per fusione di distanza constness può causare il comportamento non definito.
Altri suggerimenti
Direi static_cast
è preferibile in quanto vi permetterà solo di cast non const
a const
(che è sicuro), e non nella direzione opposta (che non è necessariamente sicuro).
Questo è un caso d'uso buono per un implicit_cast modello di funzione.
Si potrebbe scrivere la propria fusione:
template<class T>
const T & MakeConst(const T & inValue)
{
return inValue;
}