5

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的值不会改变。

我认为不是,只是想确定一下。

4

3 回答 3

7

不会。仅仅因为您的引用(或指针)是 aconst并不能阻止其他人拥有非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’
于 2011-02-26T17:52:38.967 回答
5

const Type & r意味着“不能通过对它的引用来r改变的值”——但它很可能被其他直接访问被引用值的代码(或通过非常量引用或指针)改变。对于 a 也是如此:“指向的值不能通过这个指向它的指针来改变。const Type * pp

于 2011-02-26T17:52:29.513 回答
3

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

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

于 2011-02-26T17:56:08.573 回答