const_cast — это специальный оператор приведения типов в C++, который позволяет удалять или добавлять квалификатор const/volatile у указателей или ссылок. Наиболее часто используется для передачи объекта в функцию, ожидающую неконснтантный тип, когда исходный объект был определён с modifer'ом const.
Использование:
const T& глобально), попытка писать по снятому const-признаку приводит к undefined behavior.void foo(int* p) { *p = 42; } void bar(const int* q) { // Снять const — ТОЛЬКО если исходный объект не const! foo(const_cast<int*>(q)); }
Если в bar передан указатель на int, можно безопасно снять const. Если на const int, произойдёт UB при записи.
mutable."Можно ли с помощью const_cast убрать const у объекта, который является литералом или находится в сегменте памяти лишь для чтения? Чем это грозит?"
Ответ: Можно убрать const-свойство у указателя или ссылки, но если попытаться изменить литерал или значение, размещённое в сегменте "read-only" (например, строковые литералы, статические const), произойдёт неопределённое поведение — это может привести к крашу или игнорированию записи.
Пример:
const char* str = "hello"; char* p = const_cast<char*>(str); p[0] = 'H'; // UB: строковый литерал в read-only памяти!
История
В проекте снимали const с полей, потом писали по этим полям, не осознавая, что передано было значение, реально являющееся const (глобальная константа), — приложение падало с segmentation fault на некоторых платформах.
История
В коде использовали const_cast для обхода const-методов без квалификатора mutable: внутри const-метода изменяли поля класса, что приводило к труднообнаруживаемым багам при конкурентном доступе.
История
Некорректный const_cast на объекты STL-контейнеров (например, const std::vector), после чего контейнер модифицировали — это не всегда вызывает ошибку сразу, но приводит к непредсказуемому поведению в дальнейших операциях с контейнером.