【问题标题】:Can C++ compiler assume a const bool & value will not change?C++ 编译器可以假设 const bool & value 不会改变吗?
【发布时间】:2011-07-04 23:01:07
【问题描述】:

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

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

【问题讨论】:

  • 我猜构造函数应该接受一个非常量引用。您有将引用绑定到临时对象的风险,该临时对象的生命周期以构造函数调用结束并在 doSomething 中使用悬空引用
  • @UncleBens - 甚至更好的指向 const 的指针,它可以防止调用者意外引用一个临时对象,但仍然可以让他们轻松引用一个真正是 const 的对象,或者他们通过 const 拥有的对象参考。通过努力,他们当然仍然可以获得指向临时地址的指针,但做出这种努力会给他们带来错误:template <typename T> const T* blow_leg_off(const T &t) { return &t; }test myTest(blow_leg_off(true));。仅仅初始化一个 const 引用成员是充满危险的,你可能会不小心得到一个隐式转换,所以也可以为成员使用一个指针。

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


【解决方案1】:

没有。仅仅因为您的 引用(或指针)是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_cast,或者对于更复杂的对象,mutable 属性及其误用。
【解决方案2】:

const Type &amp; r 表示“r 的值不能通过对它的引用来更改” - 但它很可能被其他直接访问引用值的代码更改(或通过非常量引用或指针)。 const Type * p 也是如此:“p 指向的值不能通过这个指向它的指针来改变

【讨论】:

    【解决方案3】:

    您是对的,它不能假设,因为_test 的引用值可能在doMore 的实现中被修改,这在编译时是不可用的。因为在这种情况下myState 不是一个 const 对象,所以doMore 可以丢弃 const 并对其进行修改(例如)。注意有效,不可取;-)

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

    【讨论】:

      猜你喜欢
      • 2011-02-13
      • 2013-01-03
      • 2013-03-13
      • 1970-01-01
      • 2014-01-16
      • 2019-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多