const_cast ist ein spezieller Typumwandlungsoperator in C++, der es ermöglicht, den Qualifizierer const/volatile von Zeigern oder Referenzen zu entfernen oder hinzuzufügen. Am häufigsten wird er verwendet, um ein Objekt an eine Funktion zu übergeben, die einen nicht-konstanten Typ erwartet, während das ursprüngliche Objekt mit dem Qualifizierer const definiert wurde.
Verwendung:
const T& global übergeben wird), führt der Versuch, nach Entfernen des const etwas zu schreiben, zu undefined behavior.void foo(int* p) { *p = 42; } void bar(const int* q) { // const entfernen — NUR, wenn das ursprüngliche Objekt nicht const ist! foo(const_cast<int*>(q)); }
Wenn in bar ein Zeiger auf int übergeben wird, kann const sicher entfernt werden. Wenn es sich um const int handelt, tritt UB beim Schreiben auf.
mutable markiert."Kann man mit const_cast const von einem Objekt entfernen, das ein Literal ist oder sich im nur lesbaren Speicher befindet? Was sind die Folgen?"
Antwort: Man kann das const-Eigenschaft von einem Zeiger oder einer Referenz entfernen, aber wenn man versucht, ein Literal oder einen Wert zu ändern, der im "read-only" Speicher (z. B. Zeichenliterale, statische const) platziert ist, tritt undefined behavior auf — dies kann zu einem Absturz oder der Ignorierung des Schreibvorgangs führen.
Beispiel:
const char* str = "hello"; char* p = const_cast<char*>(str); p[0] = 'H'; // UB: string literal in read-only memory!
Geschichte
Im Projekt wurde const von Feldern entfernt, dann wurde in diese Felder geschrieben, ohne zu erkennen, dass ein Wert übergeben wurde, der tatsächlich const war (globale Konstante) — die Anwendung stürzte mit einem segmentation fault auf einigen Plattformen ab.
Geschichte
Im Code wurde const_cast verwendet, um const-Methoden ohne den Qualifizierer mutable zu umgehen: innerhalb der const-Methode wurden die Felder der Klasse geändert, was zu schwer nachzuvollziehenden Fehlern bei gleichzeitiger Verwendung führte.
Geschichte
Falsches const_cast auf STL-Container-Objekte (z. B. const std::vector), wonach der Container modifiziert wurde — dies verursacht nicht immer sofort einen Fehler, führt jedoch zu unvorhersehbarem Verhalten bei späteren Operationen mit dem Container.