Ответ
Прямое изменение 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.