const文字与const函数作为右值?

时间:2018-07-21 11:14:07

标签: c++ const const-cast

我对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”的值吗?

2 个答案:

答案 0 :(得分:4)

int* pu1 = const_cast<int*>(&u1);

删除了const限制。

*pu1 = 10;

呼吁未定义的行为

因此

的结果
cout << u1 << endl;
cout << *pu1 <<endl;

通过c ++标准无法预测。


这是一个小小的例子:

enter image description here

因此,只需编写干净的代码,不要尝试使用 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限制可能是未定义的行为

相关问题