TGViewer
Грокаем C++ Грокаем C++ @grokaemcpp · 9.35K subscribers
Post #265 4.26K
const_cast

Оператор приведения const_cast используется для добавления или удаления спецификаторов const и volatile:
cpp
const int value = 42;
// or
volatile int value = 42;

int &reference = const_cast<int&>(value);

Это достаточно специфичное действие при разработке: удалить cv-спецификатор. Естественно, в большинстве случаев это ведет к UB, т.к. компиляторы ориентируются на cv-спецификатор при генерации инструкций. Будь то предоставление данных только на чтение, привязка к устройству ввода-вывода, запрет на кеширование значений — такие изменения сопряжены с рисками получить неопределенное поведение.

Приведу простой живой пример. Хоть ссылке reference и было присвоено значение 24 на соседней строчке, далее значение 42 подставляется напрямую. Казалось бы, это можно отследить на этапе компиляции, но нет! Даже никаких оптимизаций не указано, а компилятор всё равно проигнорирует это действие и подставит константу.

В случае с read-only, заставить явно перечитать память переменной можно, например, с помощью std::launder (since C++ 17). Но можно ли гарантировать, что везде дальше по коду оно будет перечитываться? Нет, и еще раз нет, особенно при долгой поддержке решения, особенно когда хранители знаний уходят из компании.

Оправданное использование такого приведения встречается достаточно редко. Это может быть использовано для сохранения совместимости между устаревшими версиями API, когда в действительности данные не изменяются, но этого требует интерфейс.

Я не помню, когда последний раз использовал этот оператор. Единственный раз, когда я его встретил, он был нужен, чтобы наоборот установить const квалификатор. Это, пожалуй, единственное безопасное действие, которое можно им совершить.

#cppcore
  • 🔥 15
  • 👍 5
  • ❤ 3
  • ☃ 2
More from @grokaemcpp
  1. Oct 14, 2026​​Что внутри std::condition_variable? #опытным Более менее все знакомы с примитивом синхро…
  2. Oct 12, 2026​​WAT #новичкам Как вы думаете, результат выражения: bool math = -1 < 1U; будет правдой ил…
  3. Oct 8, 2026​​Strict weak ordering #опытным На первый взгляд, всё выглядит рабочим: мы создаём 40 зака…
  4. Oct 7, 2026​​Где-то баг... #опытным Вот вам код: struct Order { int price; int id; }; int main() { st…
  5. Oct 5, 2026Откуда spurious wakeup на кондваре? #опытным У кондваров есть метод std::condition_variabl…
  6. Oct 1, 2026​​Stacktrace. Tips #опытным Чтобы полноценно работать со стандартными трейсами, нужно знат…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →