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?

È stato utile?

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;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top