static_cast(Base指针)是否应该给出编译时错误?
class A
{
public:
A()
{
}
};
class B : public A
{
public:
B()
{
}
};
int main()
{
A *a=new A();
B * b=static_cast<B*>(a); // Compile Error?
}
答案 0 :(得分:15)
它不能给出编译时错误,因为 Base-Derived relationship 可以在运行时存在,具体取决于要转换的指针的地址。
static_cast
总是成功,但如果你没有转换为正确的类型,则会引发 undefined-behavior 。 dynamic_cast
可能会失败或失败,实际上是在告诉您是否尝试转换为正确的类型。
所以在我看来,static_cast
只有在设计可以确定存在这种可能性的情况下才应该用于向下转换。一个很好的例子是CRTP。所以它在某些情况下是合乎逻辑的,但是尽量避免它,因为它是未定义的行为。
static_cast
不需要RTTI,这可能会使理论上更快,但我会随时以dynamic_cast
对static_cast
未定义的行为进行交易可能会导致!
答案 1 :(得分:13)
它没有给出编译时错误,因为强制转换很有效,而且你经常在实践中这样做,例如:
A* a = new B;
B* b = static_cast<B*>(a); // OK
在您的代码中,就编译器而言,您正在做同样的事情。它无法知道转换是无效的,所以它允许它在编译时。但是,在运行时,只要您尝试在B
的实例上使用A
的功能,就会出现一些令人讨厌的错误。