这里发生了什么?
const int a = 0;
const int *pa = &a;
int *p = const_cast<int*>(pa);
*p = 1; // undefined behavior ??
cout << a << *p; // ??
我的编译器输出 0 和 1,但“a”的地址和“p”的值是相同的,所以我很困惑这怎么可能。
这里发生了什么?
const int a = 0;
const int *pa = &a;
int *p = const_cast<int*>(pa);
*p = 1; // undefined behavior ??
cout << a << *p; // ??
我的编译器输出 0 和 1,但“a”的地址和“p”的值是相同的,所以我很困惑这怎么可能。
引用cppreference:
即使 const_cast 可以从任何指针或引用中删除 const 或易失性,使用生成的指针或引用来写入声明为 const 的对象或访问声明为 volatile 的对象会调用未定义的行为。
所以是的,修改常量变量是未定义的行为。您看到的输出是由于您告诉编译器的值a
永远不会改变,因此它可以只在行中放置文字 0 而不是a
变量cout
。
§7.1.6.1 [dcl.type.cv]/p4:
mutable
除了可以修改声明的任何类成员(7.1.1)外,任何const
在其生命周期(3.8)期间修改对象的尝试都会导致未定义的行为。
尝试写入 const 值是未定义的行为,例如,允许编译器将const
值分配到只读内存(通常在代码段中)或在编译时将它们的值内联到表达式中,这就是您的情况。