繁体   English   中英

应该static_cast <Derived *> (基本指针)给出编译时错误?

[英]Should static_cast<Derived *>(Base pointer) give compile time error?

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

它不能给出编译时错误,因为在运行时可能存在基派生关系 ,具体取决于所投射指针的地址。 static_cast始终会成功,但是如果您未static_cast转换为正确的类型,则会引发未定义的行为 dynamic_cast可能会失败,实际上会告诉您是否尝试转换为正确的类型。

因此,我认为,仅当设计可以确定存在这种可能性时,才应使用static_cast进行向下转换 CRTP是一个很好的例子。 因此,在某些情况下这是合乎逻辑的,但是请避免使用它,因为它的行为不确定。

static_cast不需要RTTI,这从理论上讲可能会使其更快 ,但是我将随时以dynamic_caststatic_cast可能导致的未定义行为!

它不会产生编译时错误,因为强制转换很可能是有效的,并且您通常会在实践中这样做,例如:

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

在代码中,就编译器而言,您正在做相同的事情。 它不知道强制转换将是无效的,因此它可以在编译时使用。 然而在运行时,你会得到一些讨厌的错误,只要你尝试使用的功能B上的一个实例A

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM