在const_cast
之后,主函数中的值不会改变。但是在调用外部函数时更改仍会在main中打印旧值(首先初始化const int
)。
int main() {
const int i = 5;
int* p = const_cast<int*>(&i);
*p = 22;
std::cout<<i;
return 0;
}
输出为5
,为什么?监视窗口显示i = 22
:
那为什么要打印5?如果我调用外部函数,输出会有所不同:
void ChangeValue(const int i) {
int* p = const_cast<int*>(&i);
*p = 22;
std::cout<<i; //Here the value changes to 22
}
int main() {
const int i = 5;
ChangeValue(i); //Value changes to 22 in the ChangeValue function
std::cout<<i // It again prints 5.
}
为什么即使在调用ChangeValue
函数后值发生变化,值也没有改变?
我在Linux平台上获得相同的输出。有人可以为我的困惑加上清晰度吗?
答案 0 :(得分:4)
尝试修改常量值会导致未定义的行为,而不是这样做。
至于为什么它没有改变,编译器发现它是一个编译时常量,可以将它存储在只读段中。
对于第二个程序,变量i
不能存储在只读段中,它像任何其他局部变量一样存储在堆栈中。但是,由于您将i
标记为不断尝试修改,因此仍然是未定义的行为。
main
程序打印旧值的原因是因为您按值传递变量 意味着它被复制到{{1}中的局部变量i
功能。如果变量在ChangeValue
或main
函数中不恒定,则ChangeValue
函数中i
的值仍不要改变。
如果更改main
函数以通过引用获取其参数,则可能会获得与第一个程序相同的行为。