const_cast 不会改变值

use*_*585 2 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;
}
Run Code Online (Sandbox Code Playgroud)

输出是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.
}
Run Code Online (Sandbox Code Playgroud)

为什么调用函数后值改变了但值没有改变ChangeValue

我在 Linux 平台上得到相同的输出。有人可以澄清我的困惑吗?

Som*_*ude 6

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

至于为什么它不改变,编译器认为它是一个编译时常量,并且可能将其存储在只读段中。也可能是因为编译器知道该值是常量,并且在生成的代码中使用实际值,而不是读取变量。


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

程序打印旧值的原因是因为您按main传递变量,这意味着它被复制到函数中的局部变量中。如果变量在或函数中不是常量,则函数中的值仍然不会改变。iChangeValuemainChangeValueimain

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