【问题标题】:Can we use `const_cast` to modify a constant variable? [duplicate]我们可以使用 `const_cast` 来修改常量变量吗? [复制]
【发布时间】:2013-10-13 01:34:24
【问题描述】:
int main()
{
const int ia = 10;
int *pia = const_cast<int*>(&ia);
*pia = 5;
std::cout << &ia << "\t" << pia <<endl;
std::cout << ia << "\t" << *pia <<endl;
return 0;
}
输出是:
0x28fef4 0x28fef4
10 5
*pia 和ia 具有相同的地址,但它们的值不同。我的目的是用const_cast修改一个常量值,结果显示不行。
有人知道为什么吗?
【问题讨论】:
标签:
c++
compiler-optimization
volatile
const-cast
【解决方案1】:
您看到为ia 打印10 的原因很可能是编译器优化:它看到了一个const 对象,决定它不会改变,并将最后的打印输出替换为:
cout<< 10 <<" "<<*ppa<<endl;
换句话说,生成的代码具有“烘焙到”二进制文件中的const 的值。
丢弃最初声明为 const 的对象的 const-ness 并写入该对象是未定义的行为:
$5.2.11/7 - 注意:根据对象的类型,通过指针、左值或指向数据成员的指针的写入操作由 const_cast 产生,该 const_cast 丢弃了 const-qualifier68)可能会产生未定义的行为(7.1 .5.1)。
根据平台的不同,const 对象可能被放置在内存的受保护区域中,您无法写入该区域。解决类型系统中的const-ness 可能有助于您的程序编译,但您可能会看到随机结果甚至崩溃。
【解决方案2】:
修改常量值是未定义的行为。不要这样做。如需修改值,请勿声明为const。