const_cast is een speciale typecast-operator in C++, die het mogelijk maakt om het const/volatile kwalificeerder van pointers of referenties te verwijderen of toe te voegen. Het wordt het vaakst gebruikt voor het doorgeven van een object aan een functie die een niet-constante type verwacht, wanneer het oorspronkelijke object gedefinieerd is met de modifier const.
Gebruik:
const T& globaal), zal een poging om te schrijven met het verwijderde const-label leiden tot undefined behavior.void foo(int* p) { *p = 42; } void bar(const int* q) { // Verwijder const — ALLEEN als het oorspronkelijke object niet const is! foo(const_cast<int*>(q)); }
Als in bar een pointer naar int wordt doorgegeven, kan const veilig worden verwijderd. Als naar const int, zal er UB optreden bij het schrijven.
mutable."Kan ik met const_cast const verwijderen van een object dat een literal is of zich in een alleen-lezen geheugensegment bevindt? Wat zijn de gevolgen?"
Antwoord: Je kunt het const-eigenschap van een pointer of referentie verwijderen, maar als je probeert een literal of een waarde die zich in een "read-only" segment bevindt (zoals string literals, statische const) te wijzigen, treedt er undefined behavior op — dit kan leiden tot crashes of negeren van de schrijfoperatie.
Voorbeeld:
const char* str = "hello"; char* p = const_cast<char*>(str); p[0] = 'H'; // UB: string literal in read-only geheugen!
Verhaal
In een project werd const verwijderd van velden, daarna werd er naar deze velden geschreven, niet beseffend dat een waarde werd doorgegeven die werkelijk const was (globale constant), — de applicatie crashte met een segmentation fault op sommige platformen.
Verhaal
In de code werd const_cast gebruikt om const-methoden te omzeilen zonder het mutable qualifier: binnen de const-methode werden de velden van de klasse gewijzigd, wat leidde tot moeilijk te detecteren bugs bij gelijktijdige toegang.
Verhaal
Onjuiste const_cast op STL-containerobjecten (bijvoorbeeld, const std::vector), daarna werd de container gemodificeerd — dit veroorzaakt niet altijd onmiddellijk een fout, maar leidt tot onvoorspelbaar gedrag bij verdere operaties met de container.