这是const_cast的未定义行为吗?

时间:2014-08-08 18:18:03

标签: c++ const-cast

这里发生了什么?

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

int *p = const_cast<int*>(pa);
*p = 1;  // undefined behavior ??
cout << a << *p;  // ??

我的编译器输出0和1,但地址为&#39; a&#39; &#39; p&#39;是一样的,所以我很困惑这是怎么回事。

3 个答案:

答案 0 :(得分:13)

引自cppreference

  

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

所以是的,修改常量变量是未定义的行为。您看到的输出是由于您告诉编译器a的值永远不会改变,因此它只能在{{1}中放置文字0而不是变量a行。

答案 1 :(得分:6)

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

  

除了可以修改声明mutable(7.1.1)的任何类成员外,   任何在其生命周期(3.8)结果中修改const对象的尝试   在未定义的行为中。

答案 2 :(得分:1)

尝试在const值上写入是未定义的行为,例如允许编译器将const值分配到只读内存(通常在代码段中)或在编译时将它们的值内联到表达式中,这是在你的情况下会发生什么。