-3

我尝试执行以下程序。

#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 是一个可变的,所以它可以被改变。当我显示 *ptr 时会反映更改,但更改不会反映. 谁能解释一下?

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

4

2 回答 2

4

来自C++03 5.2.1 const_cast /7

[注意:根据对象的类型,通过指针、左值或指向数据成员的指针的写操作由 const_cast 产生,该 const_cast 丢弃了 const 限定符可能会产生未定义的行为(7.1.5.1)。]

7.1.5.1 The cv-qualifiers /4

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

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

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

最新标准进行了微小的更改,但总体思路仍然有效。归根结底,不要那样做。

于 2013-06-25T06:24:25.720 回答
1

C++11 标准 说:

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

这意味着,在尝试执行此操作时,您不能期待任何事情。它可能有效,也可能无效,可能会引发异常,可能会终止程序,这取决于编译器的设计者如何设计它。

于 2013-06-25T06:22:29.970 回答