C++ 17 - 修改const值

The*_*yer -4 c++ const

因此,截至目前,似乎无法在C++中实际修改"const"值(在VS 2017中测试).

const int a = 5;
int* ptr = (int*)&a; // Method 1
*((int*)(&a)) = 6; // Method 2
int* ptr = const_cast<int*>(&a); // Method 3
*ptr = 55;
cout << a << "\t" << &a << endl;
cout << *ptr << "\t" << ptr << endl;
Run Code Online (Sandbox Code Playgroud)

结果:

5  SOMEMEMORYADDRESS
55 SOMEMEMORYADDRESS
Run Code Online (Sandbox Code Playgroud)

任何人都知道还有什么可以尝试达到效果?真的好奇如何有2个值的1个内存地址(至少根据控制台).

请注意:对于较旧的C++版本,有类似的主题(过去他们曾经工作过 - 但他们不再这样做了).

Nic*_*las 7

真的好奇如何有2个值的1个内存地址(至少根据控制台).

这是因为你调用了未定义的行为.来自C++ 98的C++标准明确禁止您修改声明的对象const.并且该标准具有一个包含所有内容的语句,如果您执行任何导致修改const对象的操作,则会得到未定义的行为.

因为修改声明的对象const是UB,所以编译器可以自由地假设永远不会修改此对象.所以,因为编译器可以看到aconst,它是草签5,它是有效的100%,为编译器在编译时顶替其REVERS到这个对象的一切5.所以当你这样做时cout << a,编译器可以不费心去访问内存; 它可以做到cout << 5.

如果你做了一些事情来修改后面的内存a,那就是UB,所以编译器不必关心那种情况下会发生什么.

他们过去常常工作 - 但他们不再这样做了

不,他们从不 "工作".他们只是碰巧做了你认为他们应该做的事情.但C++从未保证编译器会以这种方式运行,因此您无权抱怨编译器现在改变这种行为.