static_cast 似乎在它不可能工作时工作

static_cast seems to work when it can't possibly work

在下面的代码中,我在 void* 上使用 static_cast<B*>,它指向一个 A 对象。

AB 没有任何关系。我知道编译器不能对此提出错误。但我不明白的是,当 运行... 时,为什么这实际上似乎有效?我希望出现段错误或某种错误。

#include <iostream>

using namespace std;

class A {
    public:
    void f() const {
        cout << "f" << endl;
    }
};

class B {
    public:
    void q() {
        cout << "q" << endl;
    }
};

int main(int argc, char** argv) {
    A a;
    void* p = &a;

    static_cast<B*>(p)->q(); // Prints "q"!

    return 0;
}

这背后的机制是什么?

how come this actually seems to work when run...?

因为程序的行为是未定义的。

I would expect a segfault or an error of some kind.

当行为未定义时,无法保证会出现段错误或某种错误。通常这样的期望是不合理的。当行为未定义时,没有任何保证。

该代码会导致未定义的行为(因为它取消引用 B *,而 B * 不指向 B 对象),这意味着任何事情都可能发生。您不应该期待任何特定的后果子集。

要了解您的编译器做了什么,您可以检查程序集。我的猜测是,如果那里有一个 B 对象,编译器生成的程序集将是正确的:使用隐式参数 p 调用函数 B::q()