Я знаю, что объект const
не может вызвать функцию-член не const
. Это говорит так в C++ 14 стандарта (ISO/IEC 14882: 2014) Раздел 9.3.2, пункт 3:Const Object, Const Member Function и Mutable Variable в C++
резюме квалифицированных функция-член может быть вызван на объектно-выражения (5.2 .5) только в том случае, если объектное выражение является cv-квалифицированным или менее-cv-квалифицированным, чем функция-член.
Имеет ли это ограничение смысл, если функция-член ничего не изменяет? Или, если функция-член изменяет изменчивую переменную? Например:
class My_Class {
public:
mutable int value;
void function(int x) const { value = x; } // Correct
//void function(int x) { value = x; } // Not Correct
My_Class() : value(0) {}
};
int main(){
const My_Class obj;
obj.function(1);
return 0;
}
В данном конкретном случае, если функция const
, программа правильна и функция может изменить переменную const
объекта. Если функция не const
, программа неверна. Поэтому, в конце концов, мне нужно написать const
, чтобы иметь возможность что-то изменить, что должно быть противоположной целью const
.
Кто-нибудь знает, почему это правило спроектировано таким образом?
Объекты 'const' не подлежат изменению. Ничего не поделаешь. 'mutable' - это просто чит и предназначен для использования в переменных-членах, которые на самом деле не являются частью внутреннего состояния объекта (например, мьютекс, который должен быть заблокирован или разблокирован независимо от' const'). – DeiDei
re. «Если функция не является константой, программа неверна» ... const используется для обозначения концептуальной идентичности, а не простоты байта. неконстантные функции не должны что-то менять. – ccpgh