不,它们不应该在代码里出现,除非你真的知道你在做什么,而不是自认为知道
#include <cstdio>
struct X {
virtual void foo() {
std::puts("X");
}
~X() = default;
};
struct Y {
virtual void foo() {
std::puts("Y");
}
~Y() = default;
};
int main() {
Y y;
X *x = (X *)&y; // undefined behavior
x->foo();
}
这段代码在gcc下被编译成了
main:
因为类型转换那一行是未定义行为,gcc认为代码不可能执行到未定义行为,所以这一行及以后都被删除,Y y
也就成了废代码,也被删除,于是main
空了
(X *)
这种C风格的类型转换,最后会尝试reinterpret_cast
,以前提到过,reinterpret_cast
合法的场景非常有限,一般都会用错的