我尝试执行以下程序。
#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吗?
答案 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)中导致未定义的行为。
这意味着,在尝试这样做时,你不能指望任何事情。它可能有效,也可能没有,可能会抛出异常,程序可能会终止,具体取决于编译器的设计者如何设计它。