我对c ++编译器如何使用const变量感到困惑
const int constfunc()
{
return 7;
}
const int u1 = constfunc();
int* pu1 = const_cast<int*>(&u1);
*pu1 = 10;
cout << u1 << endl;
cout << *pu1 <<endl;
代码优先级的结果是: 10 10
虽然我尝试将常量值分配给u1变量而不是const函数,但我的意思是:
const int u1 = 7;
结果将被更改: 7 10
我确实有两个困惑: 1-我做了些改动,但结果有所不同吗? 2-据我所知,const_cast删除了指向没有const变量的const指针的const限制,但是在我的sample1中,我可以修改const变量“ u1”的值吗?
答案 0 :(得分:4)
int* pu1 = const_cast<int*>(&u1);
删除了const
限制。
*pu1 = 10;
呼吁未定义的行为。
因此
的结果cout << u1 << endl;
cout << *pu1 <<endl;
通过c ++标准无法预测。
这是一个小小的例子:
因此,只需编写干净的代码,不要尝试使用 cast 表达式破坏编译器错误,除非您100%确信自己在做什么。
答案 1 :(得分:0)
这种混淆与编译器的优化有关,即:
const int u1 = 7;
这告诉编译器u1变量不能更改,并且可以在编译时求值,因此您可以用代码的值(7)替换代码中的每个u1,即打印代码将由编译器修改为: / p>
cout << 7 << endl;
调用u1变量的地址时:
int* pu1 = const_cast<int*>(&u1);
编译器将自动为const变量创建存储并将其信息放入符号表中,因此结果为7 10。
另一种情况,当您写:
const int constfunc()
{
return 7;
}
const int u1 = constfunc();
这告诉编译器不能更改u1变量,并且u1将在运行时而不是编译时进行评估,因为它的rvalue是constfunc执行的结果,因此此处没有优化,并且u1变量将分配内存存储和打印u1代码仍将照原样从内存中获取其值:
cout << u1 << endl;
注意1:将constexpr说明符放到constfunc函数中将强制编译器在编译时不运行时对u1变量求值,因此结果将更改为7 10。
注意2:通过const_cast删除const限制可能是未定义的行为