簡體   English   中英

C ++正確的static_cast方式

[英]C++ proper way to static_cast

static_cast不會拋出異常。 但是如果它沒有成功,它將產生一個未定義的結果。 檢查演員陣容是否成功的最恰當方法是什么?

這會有幫助嗎?

NewType new_typ_obj = static_cast<NewType>(obj); 

if (new_typ_obj)
    new_typ_obj.do();

static_cast不會為您提供有關成功的信息。 如果你需要進行動態類型轉換,請使用dynamic_cast或類似boost的庫。

在您給出的示例中, static_cast 可能會根據所涉及的類型拋出異常,例如,如果NewType的構造函數拋出。 如果不存在從obj類型到NewType任何轉換鏈,那么它甚至不會編譯。

您可能正在考慮使用static_cast將指針轉換為指向派生的指針,這是dynamic_cast檢查的情況。 在這種情況下,無法判斷static_cast是否成功。 作為程序員,只有在正確的情況下才使用它是您的責任。

在指向成員類型的指針,引用或指針之間進行轉換時, static_cast僅具有未定義的行為。 當您執行向下轉換為不是指向的對象類型的類型時,會發生這種情況。

在您的示例中,除非NewType是指針或引用類型的typedef,並且obj也是這些類型,如果轉換無效,編譯器將給出錯誤。

執行if (new_typ_obj)對於在任何static_cast情況下檢查轉換是否成功沒有意義。 如果NewType不是這些多態類型之一,那么使用new_type_obj作為條件只有在你有某種方法將它轉換為bool (或者它 bool )時才有效。 即使它確實如此,它也與演員無關。 反之,如果你static_cast通過指針荷蘭國際集團以繼承層次結構,那么static_cast不會給你關於它是否成功的任何信息。 為此,您需要dynamic_cast

如果要轉換的類型要轉換的類型無關 ,則static_cast將不會編譯。 除了與所有類型相關的void * 因此,static_cast在編譯時仍然是一個很好的保證。

做出錯誤的沮喪仍有危險。

我的個人規則是:

  • 更喜歡使用static_cast進行upcast,(顯示意圖)
  • 更喜歡使用dynamic_cast進行向下轉換,並檢查返回的值。

如果用於向下轉換的static_cast是無危險的,則可以取消后一規則。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM