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

const literal versus const function as rvalue?

我对 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 删除了对指向 none const 变量的 const 指针的 const 限制,但在我的 sample1 中,我可以修改 const 变量的值 "u1"?

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

删除 const 限制。

*pu1 = 10;

要求未定义的行为

因此

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

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


这是一个小例子:

所以只写干净的代码,不要试图使用 cast 表达式来破坏编译器错误,除非你 100% 确定你在做什么。

这种混淆与编译器的优化有关,即:

const int u1 = 7;

这告诉编译器 u1 变量不能改变,可以在编译时求值,所以你可以用它的值 (7) 替换代码中的每个 u1,即打印代码将被编译器修改为:

cout << 7 << endl;

调用u1变量地址时:

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

编译器会自动为const变量创建一个存储区,并将它的信息放在一个符号table中,所以结果是7 10。

另一种情况,当你写:

const int constfunc()
{
   return 7;
}
const int u1 = constfunc();

这告诉编译器不能更改 u1 变量,u1 将在 运行 时间而不是编译时间进行评估,因为它的右值是 constfunc 执行的结果,所以这里没有优化和u1 变量将分配一个内存存储,打印 u1 代码仍然会从内存中获取它的值:

cout << u1 << endl;

注意 1:将 constexpr 说明符放在 constfunc 函数中将强制编译器在编译时计算 u1 变量,而不是 运行 时间,因此结果将更改为 7 10。

注意 2:通过 const_cast 删除 const 限制可能是 未定义的行为