2010-08-04 10 views
11

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

14

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.

+0

La maggior parte dei calchi possono essere "pericoloso". – curiousguy

+0

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? –

+0

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. –

2

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).

+0

Questo sembra corrispondere all'opinione di Scott Meyers; vedere _Efficective C++ _, elemento 3, nell'esempio "Evitare la duplicazione ...". –

2

Questo è un caso utile per un modello di funzione implicit_cast.

1

Si potrebbe scrivere il proprio fuso:

template<class T> 
const T & MakeConst(const T & inValue) 
{ 
    return inValue; 
} 
Problemi correlati