Почему можно изменять члены класса в константных функциях?

Рейтинг: 0Ответов: 1Опубликовано: 11.05.2023

Почему этот код компилируется, т.е. почему можно изменять члены в константных функциях? Ведь это предотвращает кучу оптимизаций, связанных с константностью.

struct A {
    int x = 42;
    int* y = &x;
    constexpr int foo() const {
        return ++(*y);
    }
};
static_assert(A{}.foo() == 43);

Ответы

▲ 0Принят

Всё из-за косвенности. Вы разыменовываете указатель, а разыменование не является модификацией. При этом компилятор не будет проверять на что он указывает. Так что это, можно сказать, такой хак. А вообще, для таких случаев есть ключевое слово mutable.

Что касается опитимизаций. В абстрактной машине C++ есть такое понятие как [не]наблюдаемое поведение. Всё, что вы не можете наблюдать, может быть оптимизировано по усмотрению компилятора (его разработчиков). Для предотвращения некоторых таких оптимизаций даже было введено ключевое слово volatile.