reinterpret_cast如何处理不相关的类?

roy*_*las 1 c++ pointers reinterpret-cast

以下代码中的前两行输出是两个空白行,第三行和第四行是两个不相等的大数字,如:19147336 19147192

class A {
public:
    A() : m_i(0) { }
protected:
    int m_i;
};

class B {
public:
    B() : m_d(0.0) { }
protected:
    double m_d;
};

int main() {
    A *pa = new A;
    B *pb = new B;
    std::cout << reinterpret_cast<char*>(pa) << std::endl;
    std::cout << reinterpret_cast<char*>(pb) << std::endl;
    std::cout << (int)reinterpret_cast<char*>(pa) << std::endl;
    std::cout << (int)reinterpret_cast<char*>(pb) << std::endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我想知道上面代码中reinterpret_cast的返回是什么.谢谢!

Yak*_*ont 5

你正在做未定义的行为.编译器可以自由地生成完全可以执行任何操作的代码,包括创建一个机器人,以便及时回到K&R的父母那里,并在早上吃药以防止C首先被发明.

另外,在上述前两种情况,编译器代替解释的字节int和一个double具有值0作为字符的空终止阵列,并把它看作一个0长度的缓冲区,因此在打印什么.

在第二组转换(int)案例中,它给出了sizeof(int)从中获取的指针值的低字节的整数表示new.

这些都不令人惊讶,但这些都不能依赖.从严格别名到优化,编译器在您处理未定义的行为时可能会做疯狂的事情,即使您没有附加时间机器或机器人,UB的效果也可能在UB运行的代码之前发生.