static_cast 似乎在它不可能工作时工作
static_cast seems to work when it can't possibly work
在下面的代码中,我在 void*
上使用 static_cast<B*>
,它指向一个 A
对象。
A
和 B
没有任何关系。我知道编译器不能对此提出错误。但我不明白的是,当 运行... 时,为什么这实际上似乎有效?我希望出现段错误或某种错误。
#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()
。
在下面的代码中,我在 void*
上使用 static_cast<B*>
,它指向一个 A
对象。
A
和 B
没有任何关系。我知道编译器不能对此提出错误。但我不明白的是,当 运行... 时,为什么这实际上似乎有效?我希望出现段错误或某种错误。
#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()
。