他们是正确的,这是未定义的行为。你不能修改const
变量的值,这是抛弃const
某些东西的危险:你最好知道它不是真的const
.
编译器看到它maxint
是const
并且不应该被修改,甚至不需要给它一个地址。maxint
如果它认为合适,它可以用 100 替换所有用途。正如 Matteo Italia 指出的那样,它也可能只是将常量放入只读内存的一部分,这可能是你正在发生的事情。这就是为什么修改它会产生未定义的行为。
唯一可以安全地抛弃const
变量的方法是,如果变量实际上不是const
,而是将const
限定符添加到非const
变量,如下所示:
int f(const int& x) {
int& nonconst = const_cast<int&>(x);
++nonconst;
}
int blah = 523;
f(blah); // this is safe
const int constblah = 123;
f(constblah); // this is undefined behaviour
想想这个编译完美的例子:
int f(const int& x) {
int& nonconst = const_cast<int&>(x);
++nonconst;
}
int main() {
f(4); // incrementing a number literal???
}
你可以看到 usingconst_cast
是多么危险,因为没有办法真正判断一个变量是否是原来的const
。您应该尽可能避免使用const_cast
(使用函数,只是不接受const
参数)。