Не используйте 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; }
};