【问题标题】:Why isn't assigning c*=40 change the value of a? [duplicate]为什么分配 c*=40 不改变 a 的值? [复制]
【发布时间】:2021-09-26 06:57:00
【问题描述】:
#include <iostream>
using namespace std;
int main() {
   const int a = 20;
   const int* b = &a;
   cout<<"b* = "<<*b<<"\n";
   int* c=const_cast<int *>(b);
   *c=40;
   cout<<"b* = "<<*b<<" a = "<<a;
   return 0;
}

【问题讨论】:

  • 为什么const对象的值应该改变?
  • 表达式与您描述的不同-*c = 40(在您的代码中)和c *= 40(在问题的标题中)意味着不同的东西。无论如何,您都在使用const_cast 来强制编译器稍后允许对实际上是const 的内容进行明显更改-因此您的代码具有 undefined 行为。根据定义,C++ 标准没有定义行为未定义时会发生什么,因此任何结果都是可能的(例如,不更改您希望更改的内容)并且编译器不需要发出有关未定义行为的诊断(例如错误或警告) .

标签: c++ const-cast


【解决方案1】:

您正在尝试修改 const 对象,此行为未定义。

来自C++ spec 第 10.1.7.1 节第 4 点

任何在 const 对象生命周期内修改其结果的尝试 在未定义的行为中。

const int* ciq = new const int (3);  // initialized as required
int* iq = const_cast<int*>(ciq);     // cast required
*iq = 4;                             // undefined: modifies a const object

【讨论】:

    【解决方案2】:

    a 的值没有改变,因为您正在使用 常量 int a = 20; 要更改 a 的值,您可以简单地声明 int a =20;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-22
      • 2019-02-13
      • 1970-01-01
      • 1970-01-01
      • 2020-05-02
      • 2022-12-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多