使用const_cast的奇怪行为

MGA*_*MGA 3 c++ pointers casting

我知道使用const_cast通常是坏主意,但我正在玩它,我遇到了一个奇怪的行为,其中:

两个指针具有相同的地址值,但在取消引用时,给出不同的数据值.

有没有人对此有解释?

#include <iostream>

int main()
{
    const int M = 10;

    int* MPtr = const_cast<int*>(&M);

    (*MPtr)++;

    std::cout << "MPtr = " << MPtr << "   (*MPtr) = " << (*MPtr) << std::endl;
    std::cout << "  &M = " << &M << "         M = " << M << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

产量

MPtr = 0x7fff9b4b6ce0   (*MPtr) = 11
  &M = 0x7fff9b4b6ce0         M = 10
Run Code Online (Sandbox Code Playgroud)

Vla*_*cow 5

该程序有未定义的bahaviour,因为您可能不会更改const对象.

来自C++标准

4本国际标准中将某些其他操作描述为未定义(例如,尝试修改const对象的效果).[注意:本国际标准对包含未定义行为的程序的行为没有要求. - 尾注]

  • 在这种情况下,由于你的`M`是常量,输出行甚至不会检查在其地址存储的数字.它只是一个硬编码的"print 10",因为你允许编译器假设`M`总是10. (2认同)