const_cast不会更改值

时间:2016-05-16 06:09:19

标签: c++

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

的值

Watch-window value

那为什么要打印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平台上获得相同的输出。有人可以为我的困惑加上清晰度吗?

1 个答案:

答案 0 :(得分:4)

尝试修改常量值会导致未定义的行为,而不是这样做。

至于为什么它没有改变,编译器发现它是一个编译时常量,可以将它存储在只读段中。

对于第二个程序,变量i不能存储在只读段中,它像任何其他局部变量一样存储在堆栈中。但是,由于您将i标记为不断尝试修改,因此仍然是未定义的行为。

main程序打印旧值的原因是因为您按值传递变量 意味着它被复制到{{1}中的局部变量i功能。如果变量在ChangeValuemain函数中不恒定,则ChangeValue函数中i的值不要改变。

如果更改main函数以通过引用获取其参数,则可能会获得与第一个程序相同的行为。