Может ли компилятор 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 5

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 не может быть изменено через эту ссылку на него " - но оно вполне может быть изменено другим кодом, имеющим прямой доступ к указанному значению (или через неконстантную ссылку или указатель). То же самое относится и к a const Type * p: "значение, на которое указывает p, не может быть изменено через этот указатель на него.

Вы правы, он не может этого допустить, потому что значение референда _test может быть изменено в реализации doMore, которая недоступна во время компиляции. Поскольку в этом случае myState не является объектом const, допустимо (например) для doMore отбросить const и изменить его. Примечание допустимо, не рекомендуется ; -)

И вообще, doMore может вызывать функции, которые имеют другие указатели/ссылки на тот же самый объект bool другим маршрутом. В вашем примере других нет если компилятор может видеть весь код, который может ссылаться на него (включая определение doMore), и ни один из них не изменяет значение, тогда он может сделать предположение.