Может ли компилятор C ++ предполагать, что const bool & value не изменится? - PullRequest
5 голосов
/ 26 февраля 2011

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

7 голосов
/ 26 февраля 2011

Нет. Тот факт, что ваша ссылка (или указатель) является 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’
5 голосов
/ 26 февраля 2011

const Type & r означает, что «значение r не может быть изменено посредством этой ссылки на него », но вполне может быть изменено другим кодом, который имеет прямой доступ к указанному значению (иличерез неконстантную ссылку или указатель).То же самое касается const Type * p: "значение, на которое указывает p, не может быть изменено через этот указатель на него .

3 голосов
/ 26 февраля 2011

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

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

...