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 限制可能是 未定义的行为
我对 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 限制可能是 未定义的行为