【问题标题】:C++ const_cast does not remove the const-ness of variable [duplicate]C ++ const_cast 不会删除变量的常量性[重复]
【发布时间】: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


【解决方案1】:

来自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) 期间修改它的尝试都会导致未定义的行为。

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

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

最新标准已进行了细微更改,但总体思路仍然有效。最重要的是,不要那样做。

【讨论】:

    【解决方案2】:

    C++11 标准说:

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

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

    【讨论】:

      猜你喜欢
      • 2021-06-23
      • 2016-09-21
      • 1970-01-01
      • 2021-08-30
      • 1970-01-01
      • 2011-02-21
      • 2015-03-06
      • 2011-08-27
      • 1970-01-01
      相关资源
      最近更新 更多