因此,截至目前,似乎无法在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;
结果:
5 SOMEMEMORYADDRESS
55 SOMEMEMORYADDRESS
任何人都知道还有什么可以尝试达到效果?真的好奇如何有2个值的1个内存地址(至少根据控制台)。
请注意:对于较旧的C ++版本,有类似的主题(以前它们曾经工作过 - 但它们不再存在)。
答案 0 :(得分:7)
真的很好奇如何有2个值的1个内存地址(至少根据控制台)。
这是因为您调用了未定义的行为。来自C ++ 98的C ++标准明确禁止您修改声明为const
的对象。并且该标准具有一个包含所有语句,如果您执行任何导致修改const
对象,则会得到未定义的行为。
因为修改声明为const
的对象是UB,编译器可以自由地假设永远不会修改此对象。因此,由于编译器可以看到a
是const
并且它被初始化为5
,因此编译时编译器100%有效替换使用5
与此对象相反的所有内容。因此,当你执行cout << a
时,编译器可以不费心去访问内存;它可以cout << 5
。
如果你做了一些事情来修改a
后面的内存,那就是那个UB,所以编译器不必关心那种情况下会发生什么。
他们过去常常工作 - 但他们不再是了
不,他们从不&#34;工作&#34;。他们只是碰巧做了你认为他们应该做的事情。但C ++从未保证编译器会以这种方式运行,因此您无权抱怨编译器现在改变这种行为。