2011-03-01 16 views
42

出於習慣檢查空指針的,我有時寫:將NULL /零傳遞給dynamic_cast可移植性好嗎?

MyClass * c = someBasePtr ? dynamic_cast<MyClass*>(someBasePtr) : 0; 
if (c) {... 

實際上,通過對動態轉換,也檢查返回前,檢查空指針。

我然後MSDN文檔

空指針值被轉換爲 由dynamic_cast的所述 目標類型的空指針值中讀出。

看來我可以安全地移除?:構造。這是C++ 便攜式

使得新代碼將

MyClass * c = dynamic_cast<MyClass*>(someBasePtr); 
if (c) {... 

當然假設是someBasePtr null或有效的,即不野生指向垃圾...

回答

58

§5.2.7/ 4:

如果v的值是在指針的情況下一個空指針 值,則結果是 類型R的空指針值

所以你不必自己檢查空指針。操作員刪除也一樣,刪除一個空指針沒有任何作用。

20

是的,你可以在空指針上使用dynamic_cast

+5

+1。正如5.2.7/4中所指定的 – Erik 2011-03-01 14:30:46

4

是的,檢查標準中的5.2.7.4。

0

我很好奇,並試着用Google搜索這個答案。以下代碼在C++ 14中不會產生錯誤。這裏

class A { 
public: 
    virtual ~A() {} 
}; 
class B: A {}; 
#include <iostream> 
int main() { 
    A* error_pointer = nullptr; 
    B* x = dynamic_cast<B*>(error_pointer); 
    std::cout<<"No errors :)\n"; 
} 

測試:http://ideone.com/0dSf5p

+0

爲什麼downvote?我添加了一個工作示例,這樣每個人都可以測試它......這可能是錯誤的嗎? – 2016-01-23 21:07:39

+4

我不是那個downvoted的人,但是: 問題是在規範中它是否有效,如果它是可移植的。 正如接受的答案指出,它是根據標準是有效的,但如果它不是,假設它是未定義的,你的例子可能在一個特定的編譯器中工作,但它不會回答,如果它是可移植的或不。 – user3533716 2016-01-31 23:15:40