Почему можно изменять члены класса в константных функциях?
Почему этот код компилируется, т.е. почему можно изменять члены в константных функциях? Ведь это предотвращает кучу оптимизаций, связанных с константностью.
struct A {
int x = 42;
int* y = &x;
constexpr int foo() const {
return ++(*y);
}
};
static_assert(A{}.foo() == 43);
Ответы (1 шт):
Всё из-за косвенности. Вы разыменовываете указатель, а разыменование не является модификацией. При этом компилятор не будет проверять на что он указывает. Так что это, можно сказать, такой хак. А вообще, для таких случаев есть ключевое слово mutable.
Что касается опитимизаций. В абстрактной машине C++ есть такое понятие как [не]наблюдаемое поведение. Всё, что вы не можете наблюдать, может быть оптимизировано по усмотрению компилятора (его разработчиков). Для предотвращения некоторых таких оптимизаций даже было введено ключевое слово volatile.