【发布时间】:2013-06-25 06:17:42
【问题描述】:
我尝试执行以下程序。
#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 吗?
【问题讨论】:
-
AFAIR,修改 const 变量被认为是未定义的行为。您可能会期待任何事情发生。
-
这是未定义的行为。
a确实是 const,所以你不能不调用 UB 就抛弃 const。 -
编译器很可能会将
a的所有实例优化为实际值。 -
“据我所知, const_cast 使可变” -- 不,这就是你相信,但你的信念没有充分的根据......事实上,这是错误的.
-
const_cast可能很好使*ptr可变,但它对a没有任何影响。
标签: c++ pointers casting const-cast