Per aggiungere const
a un oggetto non const, che è il metodo preferito? const_cast<T>
o static_cast<T>
. In una domanda recente, qualcuno ha detto che preferisce usare static_cast
, ma avrei pensato che lo const_cast
avrebbe reso più chiara l'intenzione del codice. Quindi, qual è l'argomento per l'utilizzo di static_cast
per creare una variabile const?const_cast vs static_cast
risposta
Non utilizzare neanche. 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
alternativa, utilizzare un modello implicit_cast
funzione, come the one provided 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 preferibile: const_cast
voglia può essere utilizzato solo per per la costanza perché è l'unico cast che può farlo, e la costanza del cast è intrinsecamente pericolosa. La modifica di un oggetto tramite un puntatore o un riferimento ottenuto mediante il cast della costanza può determinare un comportamento indefinito.
direi static_cast
è preferibile in quanto solo consentirà di lanciare da non const
-const
(che è sicuro), e non nella direzione opposta (che non è necessariamente sicuro).
Questo sembra corrispondere all'opinione di Scott Meyers; vedere _Efficective C++ _, elemento 3, nell'esempio "Evitare la duplicazione ...". –
Questo è un caso utile per un modello di funzione implicit_cast.
Si potrebbe scrivere il proprio fuso:
template<class T>
const T & MakeConst(const T & inValue)
{
return inValue;
}
La maggior parte dei calchi possono essere "pericoloso". – curiousguy
Scott Meyers fornisce un esempio dell'uso di un 'static_cast' a' const' seguito da 'const_cast' per far sì che la versione non ''const' di' operator [] 'richiami la versione' const'. Si può ottenere lo stesso usando un riferimento const? –
Sembra che tu * possa * sostituire il 'static_cast' istanziando un nuovo riferimento const, ma ovviamente devi comunque usare' const_cast' per restituire un riferimento non const. Non sono sicuro che questo sia un comportamento specifico del compilatore o della piattaforma, o se è implicito da uno dei requisiti dello standard. –