【问题标题】:Is this undefined behavior with const_cast? [duplicate]这是 const_cast 的未定义行为吗? [复制]
【发布时间】:2021-11-15 06:08:03
【问题描述】:

这里发生了什么?

const int a = 0;
const int *pa = &a;

int *p = const_cast<int*>(pa);
*p = 1;  // undefined behavior ??
cout << a << *p;  // ??

我的编译器输出 0 和 1,但是 'a' 的地址和 'p' 的值是相同的,所以我很困惑这怎么可能。

【问题讨论】:

    标签: c++ const-cast


    【解决方案1】:

    引用cppreference:

    即使 const_cast 可以从任何指针或引用中移除 const 性或易变性,使用生成的指针或引用写入声明为 const 的对象或访问声明为 volatile 的对象会调用未定义的行为。

    所以是的,修改常量变量是未定义的行为。您看到的输出是因为您告诉编译器 a 的值永远不会改变,因此它可以在 cout 行中放置一个文字 0 而不是变量 a

    【讨论】:

      【解决方案2】:

      §7.1.6.1 [dcl.type.cv]/p4:

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

      【讨论】:

        【解决方案3】:

        尝试写入 const 值是未定义的行为,例如,允许编译器将 const 值分配到只读内存(通常在代码段中)或在编译时将它们的值内联到表达式中,这就是发生的情况在你的情况下。

        【讨论】:

          猜你喜欢
          • 2011-08-23
          • 1970-01-01
          • 2018-05-03
          • 2011-11-13
          • 1970-01-01
          • 2020-06-15
          • 1970-01-01
          相关资源
          最近更新 更多