当我在c ++中学习const变量时,我尝试了这个:
#include <iostream>
int main()
{
const int p = 20;
int* a = const_cast<int*>(&p);
*a = 10;
std::cout<<"Value at a: "<<(*a)<<std::endl;
std::cout<<"Value of p: "<<p<<std::endl;
std::cout<<"Their addresses : "<<std::endl;
std::cout<<a<<" "<<&p<<std::endl;
return 0;
}
并产生输出:
Value at a: 10
Value of p: 20
Their addresses :
0x7fff4646d7d4 0x7fff4646d7d4
貌似我将值10赋给p的内存地址,但它们的值不同。为什么会这样?
答案 0 :(得分:9)
尝试修改最初声明为const
的对象会给您带来未定义的行为。
§7.1.6.1/ 4 [dcl.type.cv] 除了可以修改任何声明为
mutable
的类成员外,任何修改const
对象的尝试都会被修改它的生命周期导致不确定的行为。
有可能,您的编译器正在使用值p
替换代码中20
的所有出现,因为您承诺它不会更改。因此,打印p
的行已更改为:
std::cout<<"Value of p: "<<20<<std::endl;
无论您是否修改了原始对象,它都会打印20
。当然,由于你有未定义的行为,这种推理是徒劳的,你不应该在你的程序中调用未定义的行为。