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;
}
- 1. const_cast vs reinterpret_cast
- 2. static_cast vs dynamic_cast
- 3. const_cast VS mutabile? qualche differenza?
- 4. implicita conversione vs. static_cast quando upcasting
- 5. static_cast safety
- 6. costruttore di conversione static_cast vs operatore di conversione
- 7. const_cast e UB
- 8. come usare const_cast?
- 9. Sovraccarico di static_cast?
- 10. static_cast con boost :: shared_ptr?
- 11. Domanda su const_cast in C++
- 12. reinterpret_cast/static_cast e comportamento indefinito
- 13. errore Clang: conversione ambiguo static_cast
- 14. const_cast di un membro const statico
- 15. Uso corretto (s) di const_cast <>
- 16. const_cast nel modello. C'è un modificatore inconstante?
- 17. C++ std :: forward <T> vs static_cast <T>
- 18. static_cast e reinterpret_cast per std :: aligned_storage
- 19. È ok a static_cast un puntatore * vuoto
- 20. SFINAE: 'static_cast <void>()' o ', void()'?
- 21. Can static_cast può generare un'eccezione in C++?
- 22. Arrotondamento con static_cast <int>?
- 23. Il const_cast causa mai emissione di codice effettiva?
- 24. Esempio non banale di comportamento non definito con const_cast
- 25. Dovrei const_cast "questo" quando un metodo accetta solo Foo * const?
- 26. Qual è la differenza tra static_cast e Implicit_cast?
- 27. Si può evitare un sovraccarico vtable usando un static_cast?
- 28. Come può essere usato static_cast con l'ereditarietà virtuale?
- 29. Perché non posso static_cast tra char * e unsigned char *?
- 30. C'è un motivo per usare const_cast su una stringa letterale in questo codice?
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. –