C++ 这是const_cast的未定义行为吗?

C++ 这是const_cast的未定义行为吗?,c++,const-cast,C++,Const Cast,这里发生了什么 const int a = 0; const int *pa = &a; int *p = const_cast<int*>(pa); *p = 1; // undefined behavior ?? cout << a << *p; // ?? const int a=0; 常数int*pa=&a; int*p=常数(pa); *p=1;//未定义的行为?? 引用自: 即使const_cast可以从任何指针或引用中删除cons

这里发生了什么

const int a = 0;
const int *pa = &a;

int *p = const_cast<int*>(pa);
*p = 1;  // undefined behavior ??
cout << a << *p;  // ??
const int a=0;
常数int*pa=&a;
int*p=常数(pa);
*p=1;//未定义的行为??
引用自:

即使const_cast可以从任何指针或引用中删除constness或volatile,但使用结果指针或引用写入声明为const的对象或访问声明为volatile的对象会调用未定义的行为


是的,修改常量变量是未定义的行为。您看到的输出是由于您告诉编译器
a
的值永远不会更改,因此它可以在
cout
行中放置一个文本0而不是变量
a

§7.1.6.1[dcl.type.cv]/p4:

除了任何声明为可变的类成员(7.1.1)都可以修改之外, 在对象的生存期(3.8)内修改
const
对象的任何尝试都会导致 在未定义的行为中


尝试在常量值上写入是未定义的行为,例如,允许编译器将
const
值分配到只读内存(通常在代码段中)或在编译时将其值内联到表达式中,这就是您的情况