2016-06-20 75 views
-1

說我有類層次結構:在C++ 11中,失敗的dynamic_cast是否返回NULL或std :: nullptr?

class Base{ 
} 

class Derived : public Base{ 

} 

假設我要檢查的對象是類型派生與否:

Base* b = new Base(); 
Derived* d = dynamic_cast<Derived*>(b); 
if(b!=nullptr){ //Should this check be for 0, NULL or nullptr ? 
// b is not Derived 
} 

我應該測試爲0,在C NULL或nullptr ++ 11?

找到答案(對不起,我通過谷歌搜索它沒有顯示出來) In c++11, does dynamic_cast return nullptr or 0?

+1

無論你應該測試'nullptr'以便與代碼讀者進行最清楚的交流,這就是數字機器代碼之上的語言編程的全部內容。 –

+1

失敗的'dynamic_cast '不會返回0,NULL或nullptr。它返回一個空的'Base *'。但是這與你應該將其與哪三個比較的問題無關。 –

+0

@BenjaminLindley那麼爲什麼有些人在測試dynamic_cast是否有效時檢查0? –

回答

3
C++ 11§5.2.7/ 9

的失敗的[動態]強制轉換爲指針類型的值是所需結果類型的空指針值。

無論如何,使用nullptr是一個好主意,以便與代碼讀者清楚地溝通。

請注意,引用類型失敗的dynamic_cast會引發異常,因爲不存在null引用。


爲了檢查某個對象靜態已知多態性類型Baseo確實是一個Derived,你可以直接在if條件–使用dynamic_cast沒有必要明確地把它比任何東西:

if(auto pd = dynamic_cast<Derived*>(&o)) 
{ 
    // Use pd here 
} 
+0

我不明白的部分是當他們說「所需結果類型的空指針值」時。那是什麼意思 ?不應該由std :: nullptr的任何類型的空指針值?那麼爲什麼人們測試0呢? –

+0

@約翰:例如所需結果類型'int *'的空指針值是'static_cast (0)'。 –

+0

這真的很令人困惑 - 但不應該任何東西的空指針值是0或std :: nullptr?它似乎打敗了std :: nullptr的目的.. –

相關問題