const_cast è un operatore di cast speciale in C++ che permette di rimuovere o aggiungere il qualificatore const/volatile a puntatori o riferimenti. Viene utilizzato più comunemente per passare un oggetto a una funzione che si aspetta un tipo non costante, quando l'oggetto originale è stato definito con il modificatore const.
Utilizzo:
const T& globalmente), cercare di scrivere dopo aver rimosso il const porta a comportamenti indefiniti.void foo(int* p) { *p = 42; } void bar(const int* q) { // Rimuovi const — SOLO se l'oggetto originale non è const! foo(const_cast<int*>(q)); }
Se in bar viene passato un puntatore a int, è possibile rimuovere in sicurezza il const. Se è a const int, si verificherà UB alla scrittura.
mutable."È possibile rimuovere const da un oggetto che è un letterale o si trova in una sezione di memoria solo per lettura usando const_cast? Quali conseguenze comporta?"
Risposta: È possibile rimuovere la proprietà const da un puntatore o riferimento, ma se si tenta di modificare un letterale o un valore collocato in una sezione "read-only" (ad esempio, letterali di stringa, const statici), si verificherà un comportamento indefinito – questo può portare a crash o all'ignoranza della scrittura.
Esempio:
const char* str = "hello"; char* p = const_cast<char*>(str); p[0] = 'H'; // UB: letterale di stringa in memoria read-only!
Storia
In un progetto veniva rimosso il const dai campi, poi si scriveva su questi campi, non rendendosi conto che era stato passato un valore, effettivamente costante (una costante globale), e l'applicazione si bloccava con segmentation fault su alcune piattaforme.
Storia
Nel codice si utilizzava const_cast per bypassare metodi const senza qualificatore mutable: all'interno del metodo const si cambiavano i campi della classe, causando bug difficili da rilevare durante l'accesso concorrente.
Storia
const_cast non corretto su oggetti contenitori STL (ad esempio, const std::vector), dopo di che il contenitore veniva modificato — questo non sempre genera un'errore immediatamente, ma porta a comportamenti imprevedibili nelle operazioni successive con il contenitore.