Как изменить const переменную в C++?

«Как изменить const переменную в C++?» — вопрос из категории C++ Core, который задают на 25% собеседований C/C++ Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Прямое изменение const переменной в C++ невозможно — это нарушает гарантии константности и ведёт к неопределённому поведению (UB). Однако существуют обходные пути, которые следует использовать с крайней осторожностью и только в исключительных случаях.

1. Использование const_cast (опасно, UB):

const int x = 10;
int* ptr = const_cast<int*>(&x);
*ptr = 20; // Неопределённое поведение! Значение может не измениться.
std::cout << x << ' ' << *ptr; // Может вывести 10 20

Этот метод нарушает семантику языка. Компилятор может поместить x в read-only память или заинлайнить её значение.

2. Использование mutable в классах (легально):

struct Cache {
    mutable int computed_value = 0; // mutable разрешает изменение в const-контексте
    int getValue() const {
        if (computed_value == 0) {
            computed_value = expensiveCalculation(); // Допустимо
        }
        return computed_value;
    }
};
const Cache c;
int val = c.getValue(); // Модифицирует mutable-поле

mutable предназначен для логически константных, но физически изменяемых данных (кэш, счётчики вызовов).

Правильный подход: Если возникает необходимость изменить const переменную, это сигнал о проблеме в архитектуре. Следует пересмотреть дизайн: использовать неконстантную переменную, инкапсулировать состояние в класс с методами доступа или применить шаблон «ленивой инициализации» через mutable.