我有以下代码:
const int k=1;
int *p=const_cast<int *>( &k);
cout<<"k before="<<*p<<endl;
*p=10;
*const_cast<int *>( &k)=12;
cout<<"k after="<<k<<endl;
Run Code Online (Sandbox Code Playgroud)
输出是:
k before=1
k after=1
Run Code Online (Sandbox Code Playgroud)
为什么const const不在这里工作?
Pet*_*der 12
const_cast如果你抛弃然后写入值,会导致未定义的行为const.如你所见,没有做任何事情是有效的行为.
在您的特定示例中,可能发生的情况是编译器看到k使用const存储类声明的,知道它不能(合法地)更改,并替换
cout<<"k after="<<k<<endl;
Run Code Online (Sandbox Code Playgroud)
同
cout<<"k after="<<1<<endl;
Run Code Online (Sandbox Code Playgroud)
如果您关闭优化,您可能(或可能不会)获得不同的结果.
抛弃const调用未定义行为的原因是编译器可以自由地进行这样的优化.如果const变量可以自由地转换为非const变量并写入,那么const对编译器来说绝对没有意义.