这里发生了什么?
const int a = 0;
const int *pa = &a;
int *p = const_cast<int*>(pa);
*p = 1; // undefined behavior ??
cout << a << *p; // ??
Run Code Online (Sandbox Code Playgroud)
我的编译器输出0和1,但'a'的地址和'p'的值是相同的,所以我很困惑这是怎么回事.
Bau*_*gen 13
引用来自cppreference:
尽管const_cast可以从任何指针或引用中删除constness或volatile,但是使用结果指针或引用来写入声明为const的对象或访问声明为volatile的对象会调用undefined行为.
所以是的,修改常量变量是未定义的行为.您所看到的输出通过的事实,你告诉的价值编译器造成a永远不会改变,所以它可以只是把文字0,而不是变量a的cout线.
§7.1.6.1[dcl.type.cv]/p4:
除了
mutable可以修改声明的任何类成员(7.1.1)之外,任何const在其生命周期内修改对象的尝试(3.8)都会导致未定义的行为.