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
来修改常量值,但结果表明它不起作用。
有谁知道为什么?
答案 0 :(得分:8)
您为10
打印ia
的原因很可能是编译器优化:它看到const
对象,决定它不会改变,并替换最后一个打印输出有了这个:
cout<< 10 <<" "<<*ppa<<endl;
换句话说,生成的代码将const
“的值烘焙到”二进制文件中。
抛弃最初声明为const
的对象的常量并写入该对象是未定义的行为:
$ 5.2.11 / 7 - 注意:根据对象的类型,通过指针,左值或指向数据成员的指针的写入操作可能会产生未定义的行为(7.1),这可能会产生一个const-qualifier68的const_cast。 1.5.1)。
根据平台的不同,const
个对象可能会放置在您无法写入的受保护的内存区域中。在类型系统中使用const
- 可以帮助您的程序编译,但您可能会看到随机结果甚至崩溃。
答案 1 :(得分:6)
修改常量值是未定义的行为。不要这样做。如果您需要修改该值,请不要将其声明为const
。