当我在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;
}
Run Code Online (Sandbox Code Playgroud)
它产生输出:
Value at a: 10
Value of p: 20
Their addresses :
0x7fff4646d7d4 0x7fff4646d7d4
Run Code Online (Sandbox Code Playgroud)
似乎我将值10赋值给p的内存地址,但它们的值不同.为什么会这样?
尝试修改最初声明的对象const会给您带来未定义的行为.
§7.1.6.1/ 4 [dcl.type.cv]除了
mutable可以修改声明的任何类成员之外,任何const在其生命周期内修改对象的尝试都会导致未定义的行为.
有可能,你的编译器正在用p代值替换代码中的所有出现20,因为你已经承诺它不会改变.所以打印的行p已更改为:
std::cout<<"Value of p: "<<20<<std::endl;
Run Code Online (Sandbox Code Playgroud)
因此20无论您是否修改了原始对象,它都会打印出来.当然,由于您有未定义的行为,这种推理是徒劳的,您不应该在程序中调用未定义的行为.