C ++ 17 - 修改const值

时间:2018-01-28 02:22:07

标签: 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;

结果:

5  SOMEMEMORYADDRESS
55 SOMEMEMORYADDRESS

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

请注意:对于较旧的C ++版本,有类似的主题(以前它们曾经工作过 - 但它们不再存在)。

1 个答案:

答案 0 :(得分:7)

  

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

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

因为修改声明为const的对象是UB,编译器可以自由地假设永远不会修改此对象。因此,由于编译器可以看到aconst并且它被初始化为5,因此编译时编译器100%有效替换使用5与此对象相反的所有内容。因此,当你执行cout << a时,编译器可以不费心去访问内存;它可以cout << 5

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

  他们过去常常工作 - 但他们不再是

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