Может ли компилятор C++ предположить, что значение const bool & не изменится?
Может ли компилятор C++ предположить, что значение 'const bool &' не изменится?
Например, представьте, что у меня есть класс:
class test {
public:
test(const bool &state)
: _test(state) {
}
void doSomething() {
if (_test) {
doMore();
}
}
void doMore();
private:
const bool &_test;
};
И я использую его следующим образом:
void example() {
bool myState = true;
test myTest(myState);
while (someTest()) {
myTest.doSomething();
myState = anotherTest();
}
}
Разрешено ли стандартом для компилятора предполагать, что значение _test не изменится.
Я думаю, что нет, но просто хочу быть уверенным.3 ответа:
Нет. Только потому, что Ваша ссылка (или указатель) является
const
, не мешает кому-то другому иметь неconst
ссылку. Вот так:int main(void) { bool myState = true; test myTest(myState); std::cout << myTest.getState() << std::endl; myState = false; std::cout << myTest.getState() << std::endl; }
Или еще проще:
bool a = true; const bool& b = a; a = false; // OK b = true; // error: assignment of read-only reference ‘b’
const Type & r
означает ,что" значениеr
не может быть изменено через эту ссылку на него " - но оно вполне может быть изменено другим кодом, имеющим прямой доступ к указанному значению (или через неконстантную ссылку или указатель). То же самое относится и к aconst Type * p
: "значение, на которое указываетp
, не может быть изменено через этот указатель на него.
Вы правы, он не может этого допустить, потому что значение референда
_test
может быть изменено в реализацииdoMore
, которая недоступна во время компиляции. Поскольку в этом случаеmyState
не является объектом const, допустимо (например) дляdoMore
отбросить const и изменить его. Примечание допустимо, не рекомендуется ; -)И вообще,
doMore
может вызывать функции, которые имеют другие указатели/ссылки на тот же самый объектbool
другим маршрутом. В вашем примере других нет если компилятор может видеть весь код, который может ссылаться на него (включая определениеdoMore
), и ни один из них не изменяет значение, тогда он может сделать предположение.