Может ли компилятор 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), и ни один из них не изменяет значение, тогда он может сделать предположение.