Не используйте const_cast для обхода cv-квалификаторов
Не используйте const_cast для снятия const или volatile с переменных, аргументов или this в const-методах. Если вам кажется, что это необходимо — пересмотрите дизайн: скорее всего, проблема в неправильной расстановке const, а не в необходимости его снять.
Неправильно:
// снятие const с переменной
void bad_example(const int& value) {
int& mutable_ref = const_cast<int&>(value);
mutable_ref = 42; // UB если исходный объект действительно const
}
// снятие const с this в методе
class BadClass {
int cached_value_ = -1;
public:
int get_value() const {
// Нарушение контракта const-метода
return const_cast<BadClass*>(this)->calculate_and_cache();
}
private:
int calculate_and_cache() {
cached_value_ = expensive_calculation();
return cached_value_;
}
};
Правильно:
// использование mutable для легального изменения в const-методе
class GoodClass {
mutable int cached_value_ = -1; // mutable разрешает изменение в const
public:
int get_value() const {
if (cached_value_ == -1) {
cached_value_ = expensive_calculation();
}
return cached_value_;
}
private:
static int expensive_calculation() { return 42; }
};
// правильная расстановка const
class BetterClass {
public:
int get_value() const {
return calculate_value(); // const-метод вызывает const-метод
}
private:
static int calculate_value() { return 42; }
};