[英]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是無危險的,則可以取消后一規則。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.