C++ const_cast不会更改该值

C++ const_cast不会更改该值,c++,C++,const_cast之后,主函数中的值不会更改。但是调用外部函数时会发生变化,仍然会在首先初始化const int的main中打印旧值 int main() { const int i = 5; int* p = const_cast<int*>(&i); *p = 22; std::cout<<i; return 0; } 为什么在调用ChangeValue函数后,即使值发生更改,也不会更改该值 我在Linux平台上得到

const_cast之后,主函数中的值不会更改。但是调用外部函数时会发生变化,仍然会在首先初始化const int的main中打印旧值

int main() {
    const int i = 5;
    int* p = const_cast<int*>(&i);
    *p = 22;
    std::cout<<i;
    return 0;
}
为什么在调用ChangeValue函数后,即使值发生更改,也不会更改该值


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

试图修改常量值会导致未定义的行为,只是不要这样做

至于为什么它没有改变,编译器认为它是一个编译时常量,并可能将其存储在只读段中

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

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


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

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

至于为什么它没有改变,编译器认为它是一个编译时常量,并可能将其存储在只读段中

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

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

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

可能会将其存储在只读段中-这可能会导致SIGSEGV或类似事件;看到5 printed更可能与编译器在遇到尝试写入时没有更新其内部记录的值i有关,它没有义务对具有未定义行为的代码的影响进行建模,并且,因为cout可能将其存储在只读段中-这可能会导致SIGSEGV或类似事件;看到5 printed更可能与编译器在遇到尝试写入时没有更新其值i的内部记录有关。它没有义务对具有未定义行为的代码的影响进行建模,并且,对于cout
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.
}