这是代码
int main()
{
const int i = 2;
const int * pi = &i;
int* j = const_cast<int *> (pi);
*j = 11;
std::cout << *pi << std::endl;
std::cout << i << std::endl;
return 0;
}
结果:
11
2&lt; ---为什么?
答案 0 :(得分:9)
正如http://en.cppreference.com/w/cpp/language/const_cast所说:
即使
const_cast
可以从任何指针或引用中删除constness或volatile,使用结果指针或引用来写入声明为const
的对象,或者访问声明为{{{ 1}}调用未定义的行为。
在这种情况下,您的编译器显然已经优化
volatile
到
std::cout << i << std::endl;
因为 std::cout << 2 << std::endl;
是i
,并且其值无法在任何有效程序中更改。 (实际上,const
的值会发生更改,因为程序无效;但是你的编译器 - 非常正确 - 并不关心这种可能性.C ++编译器和程序员,通常认为优化正确的代码比减少错误代码的不正确性更重要。)