C ++ const_cast不会删除变量的常量

时间:2013-06-25 06:17:42

标签: c++ pointers casting const-cast

我尝试执行以下程序。

#include<iostream>
using namespace std;
int main()
{
const int a = 0;
cout << &a <<endl;
int* ptr = const_cast<int*>(&a);
*ptr = 2;
cout << ptr <<endl;
cout << *ptr <<endl;
cout << a <<endl;
return 0;
}

输出结果为:

   0xbf92ebd8
   0xbf92ebd8
   2
   0

据我所知,const_cast使 a 变为可变,因此可以更改它。当我显示* ptr时会反映更改,但更改不会反映在 a 中。 谁能解释一下?

编辑: 感谢所有的答案。我知道我正在观察一个未定义的行为。而且,我最初在 mutable 和* const_cast *之间感到困惑。 但是,你能告诉我所有情况,我们使用const_cast吗?

2 个答案:

答案 0 :(得分:4)

来自C++03 5.2.1 const_cast /7

  

[注意:根据对象的类型,通过指针执行写入操作,lvalue或指向数据成员的指针会导致const_cast可以产生未定义的行为( 7.1.5.1)。 ]

7.1.5.1 The cv-qualifiers /4

  

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

并且,在术语和定义部分:

  

[注意:允许的未定义行为范围从完全忽略情况,结果不可预测,在翻译或程序执行期间以环境特征记录的方式行事(有或没有发布诊断)消息),终止翻译或执行(发布诊断消息)。

最新标准已经有了细微的变化,但总体思路仍然存在。最重要的是,不要这样做。

答案 1 :(得分:1)

C ++ 11 Standard说:

7.1.6.1
(...)
4除了可以修改声明为mutable(7.1.1)的任何类成员之外,任何修改const的尝试都是如此 对象在其生命周期(3.8)中导致未定义的行为。

这意味着,在尝试这样做时,你不能指望任何事情。它可能有效,也可能没有,可能会抛出异常,程序可能会终止,具体取决于编译器的设计者如何设计它。