C ++编译器可以假设一个const bool&价值不会改变?

时间:2011-02-26 17:48:48

标签: c++ reference const language-lawyer side-effects

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 个答案:

答案 0 :(得分:7)

没有。仅仅因为你的引用(或指针)是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’

答案 1 :(得分:5)

const Type & r表示“r的值无法通过此引用”更改“ - 但可能会被其他可直接访问的代码更改引用的值(或通过非const引用或指针)。同样适用于const Type * p:“p指向的值无法通过此指针更改

答案 2 :(得分:3)

你是对的,它不能假设,因为在_test的实现中可能会修改doMore的referand的值,这在编译时是不可用的。因为在这种情况下myState不是const对象,所以doMore对于抛弃const并修改它是有效的(例如)。注意有效,不可取; - )

通常,doMore可能会通过另一个路由调用具有其他指针/对同一bool对象的引用的函数。在您的示例中,没有其他引用,因此如果编译器可以看到可能引用它的所有代码(包括doMore的定义),并且它们都没有修改该值,然后它可以做出假设。