2013-05-30 30 views
3

在發佈std::shared_ptr<T>之後,當我做ptr.get()時,返回值是NULLnullptr?爲了比較,我用這個:shared_ptr <T> :: get()在發佈後的返回值是什麼?

std::shared_ptr<int> ptr(new int(44)); 

ptr.reset(); 
int *p = ptr.get(); 

if (p == nullptr) 
{ 
    cout << "nullptr"; 
} 

if (p == NULL) 
{ 
    cout << "NULL"; 
} 

兩者似乎都是結果。

+4

如果沒有'if(nullptr == NULL){cout <<「它們是相同的! << endl; }'line :) :) :) – dasblinkenlight

+0

你可能不知道的另一件事是'shared_ptr'對'bool'有一個隱式轉換,它基本上等於'p!= nullptr'。因此,您可以編寫'p == nullptr' *或*'!p' - 無論哪一個更直觀。 –

+1

'ptr.get()'的值是空'int *'值(而不是空'nullptr_t'值或'0'整數值),因此以下代碼將更接近'typedef int * intp; if(p == intp {}){std :: cout <<「intp {}」; }'。也就是說,以上所有內容都可以隱式轉換/相互比較,所以它並不重要。 – Mankarse

回答

12

在C++ 11中,使用nullptr

這是事實,它們都是正確的,等效在這種情況下,因爲兩者都是空指針常數如段落4.10/1指定(NULL通常#define d是0):

A 空指針常量是整數類型的整數常量表達式(5.19)值,其值爲 零或std::nullptr_t類型的值。空指針常量可以轉換爲指針類型; 結果是該類型的空指針值並且與對象指針或函數指針類型的每個其他值相區別。

然而,nullptr由類型系統認定爲指針文字nullptr_t類型,並且作爲一種特殊的空指針常量,所以它的語義是明確雙方你和編譯器。另一方面,NULL只是一個已知擴展爲零的宏。

2

2.14.7指針文字[lex.nullptr]

指針字面是關鍵字nullptr。這是一個類型爲 std :: nullptr_t的prvalue。 [注意:std :: nullptr_t是一個不同的類型,它既不是指針類型也不是指向成員類型的指針;相反,此類型的預值 是空指針常量,可以將其轉換爲空值 指針值或空成員指針值。

兩者都是等價的,但您應該更喜歡使用nullptr。

相關問題