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的值不会改变。
我想不是,但只是想确定。
答案 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
的定义),并且它们都没有修改该值,然后它可以做出假设。