2017-05-22 33 views
1

我目前正在研究一些看起來很奇怪的第三方C++代碼(我從C++ 11開始)。其中一個給我留下了很多東西疑惑,是static_castNULL在許多情況下某些指針類型:在C++中將SomeType *轉換爲NULL有什麼用?

SomeClass* someClassPtr = static_cast<SomeClass*>(NULL); 

我知道你可以施放例如指針從基類指針轉換爲派生類指針,但這裏絕對沒有繼承。據我所看到的,這已經足夠了:

SomeClass* someClassPtr = NULL; 

但在這個代碼,其中NULL沒有得到澆鑄爲特定的指針類型的唯一案例,在載體和其他容器指針:

SomeOtherClass.vecOfSomeClassPtr[i] = NULL; 

所以我的問題是:

  • 這是簡單的舊式(甚至C-樣式)代碼之前有nullptr
  • 是否/正在鑄造NULL其他事情需要比使用繼承時的down/upcasting?
  • 或者我完全錯過了什麼?

而如果我沒有得到它錯了到目前爲止:
我先被替換的static_cast<type*>(NULL)所有實例NULL後來nullptr,看是否會破壞任何東西:不。 編譯器不會抗議,程序似乎仍然按預期工作。 但我知道指針可能會非常棘手的小混蛋,於是:

  • 有關使用nullptr什麼陷阱沒有我可能會錯過?

PS:是的,我確實使用了搜索,是的,我在C代碼上找到了類似的問題。 但這是C++代碼,我很想知道,而不是僅僅假設某件事。

+2

在一個問題中你有很多問題。 – user2079303

+0

我會牢記未來。 – Floriel

回答

4

在C++中將NULL轉換爲SomeType *有什麼用?

SomeClass* someClassPtr = static_cast<SomeClass*>(NULL); 

演員在這方面沒有任何影響。

但更普遍的,它有一定道理在超載涉及一些其他方面:

void stupidly_overloaded_function(int); 
void stupidly_overloaded_function(SomeClass*); 
void stupidly_overloaded_function(SomeOtherClass*); 

stupidly_overloaded_function(NULL); 

哪個函數被調用?它實際上取決於NULL的定義。它可能會調用int重載,或者由於含糊不清導致編譯失敗。

的鑄造制可以消除歧義電話:

stupidly_overloaded_function(static_cast<SomeClass*>(NULL)); 

我覺得這是引入nullptr一個顯著的原因。雖然連nullptr不能與多個不同的指針重載處理,但這整數之間的歧義:

void not_quite_as_silly_overload(int); 
void not_quite_as_silly_overload(SomeClass*); 

not_quite_as_silly_overload(NULL); // might call either overload 
not_quite_as_silly_overload(nullptr); // unambiguously calls the pointer overload 

用C另一種情況是涉及對象的大小,如從Linux內核container_of宏宏:

define container_of(ptr, type, member) ({      \ 
     const typeof(((type *)0)->member) *__mptr = (ptr); \ 
     (type *)((char *)__mptr - offsetof(type,member));}) 

這裏,僅使用0代替NULL。我想認爲這可以用C++實現而不用強制轉換,但只能使用在C++ 11中引入的declval


這是簡單的舊式(甚至C-樣式)代碼之前有nullptr?

不,這種多餘的演員陣容沒有通用的風格。你的例子沒有重載,所以上面的情況不適用於它。

在處理繼承時,/是否正在將NULL轉換爲除了向下/向上轉換之外的其他內容所必需的NULL?

不,它是(並且仍然是在不同的指針重載情況下)重載解析所必需的。

+0

所以我應該小心地在函數調用中替換這些強制轉換,但應該保存在賦值中。 – Floriel

+1

@Floriel在指定相同類型的指針時絕對安全。只要你使用'nullptr',可能對函數調用是安全的。如果超載失敗,您會在構建時看到。 – user2079303

相關問題