static_cast <derived * =“”>(基本指针)是否会产生编译时错误?</derived>

时间:2010-03-18 10:29:25

标签: c++ casting

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?
}

2 个答案:

答案 0 :(得分:15)

它不能给出编译时错误,因为 Base-Derived relationship 可以在运行时存在,具体取决于要转换的指针的地址。 static_cast总是成功,但如果你没有转换为正确的类型,则会引发 undefined-behavior dynamic_cast可能会失败或失败,实际上是在告诉您是否尝试转换为正确的类型。

所以在我看来,static_cast只有在设计可以确定存在这种可能性的情况下才应该用于向下转换。一个很好的例子是CRTP。所以它在某些情况下是合乎逻辑的,但是尽量避免它,因为它是未定义的行为。

static_cast不需要RTTI,这可能会使理论上更快,但我会随时以dynamic_caststatic_cast未定义的行为进行交易可能会导致!

答案 1 :(得分:13)

它没有给出编译时错误,因为强制转换很有效,而且你经常在实践中这样做,例如:

A* a = new B;
B* b = static_cast<B*>(a); // OK

在您的代码中,就编译器而言,您正在做同样的事情。它无法知道转换是无效的,所以它允许它在编译时。但是,在运行时,只要您尝试在B的实例上使用A的功能,就会出现一些令人讨厌的错误。