簡體   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