【发布时间】: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