const_cast jest specjalnym operatorem rzutowania typów w C++, który pozwala na usuwanie lub dodawanie kwalifikatora const/volatile do wskaźników lub referencji. Najczęściej jest używany do przekazywania obiektu do funkcji, która oczekuje nieconstowego typu, gdy pierwotny obiekt został zdefiniowany z modyfikatorem const.
Użycie:
const T& globalnie), próba zapisu po zdjęciu const prowadzi do niezdefiniowanego zachowania.void foo(int* p) { *p = 42; } void bar(const int* q) { // Zdjmnij const - TYLKO jeśli pierwotny obiekt nie jest const! foo(const_cast<int*>(q)); }
Jeśli do bar przekazany jest wskaźnik do int, można bezpiecznie zdjąć const. Jeśli jest to const int, wystąpi UB przy zapisie.
mutable."Czy można za pomocą const_cast usunąć const z obiektu, który jest literatem lub znajduje się w segmencie pamięci tylko do odczytu? Co to grozi?"
Odpowiedź: Można usunąć const z wskaźnika lub referencji, ale jeśli spróbujesz zmienić literat lub wartość umieszczoną w segmencie "read-only" (np. literały stringowe, statyczne const), wystąpi niezdefiniowane zachowanie - to może prowadzić do awarii lub ignorowania zapisu.
Przykład:
const char* str = "hello"; char* p = const_cast<char*>(str); p[0] = 'H'; // UB: literat stringowy w pamięci tylko do odczytu!
Historia
W projekcie zdejmowano const z pól, a następnie zapisywano do tych pól, nie zdając sobie sprawy, że przekazano wartość, która tak naprawdę była const (globalna stała) - aplikacja padała z segmentation fault na niektórych platformach.
Historia
W kodzie używano const_cast do obejścia metod const bez kwalifikatora mutable: wewnątrz metody const zmieniano pola klasy, co prowadziło do trudnych do wykrycia błędów przy równoległym dostępie.
Historia
Niepoprawny const_cast na obiektach STL-kontenerów (np. const std::vector), po czym kontener był modyfikowany - nie zawsze wywołuje to błąd od razu, ale prowadzi do nieprzewidywalnego zachowania w kolejnych operacjach na kontenerze.