因此,截至目前,似乎无法在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++版本,有类似的主题(过去他们曾经工作过 - 但他们不再这样做了).
真的好奇如何有2个值的1个内存地址(至少根据控制台).
这是因为你调用了未定义的行为.来自C++ 98的C++标准明确禁止您修改声明的对象const.并且该标准具有一个包含所有内容的语句,如果您执行任何导致修改const对象的操作,则会得到未定义的行为.
因为修改声明的对象const是UB,所以编译器可以自由地假设永远不会修改此对象.所以,因为编译器可以看到a是const,它是草签5,它是有效的100%,为编译器在编译时顶替其REVERS到这个对象的一切5.所以当你这样做时cout << a,编译器可以不费心去访问内存; 它可以做到cout << 5.
如果你做了一些事情来修改后面的内存a,那就是UB,所以编译器不必关心那种情况下会发生什么.
他们过去常常工作 - 但他们不再这样做了
不,他们从不 "工作".他们只是碰巧做了你认为他们应该做的事情.但C++从未保证编译器会以这种方式运行,因此您无权抱怨编译器现在改变这种行为.
| 归档时间: |
|
| 查看次数: |
91 次 |
| 最近记录: |