2011-08-29 25 views
10

shared_ptr的工作,在C++中,我可以寫這樣的:如何,如果條件

shared_ptr<A> a_sp = someFunctionReturningSharedPtr(); 
if (a_sp) { 
    cout << a_sp->someData << endl; 
} else { 
    cout << "Shared Pointer is NULL << endl; 
} 

爲什麼if (a_sp)檢查工作是否正確? a_sp不是布爾值,但它是如何檢查真或假? if條件知道如何檢查a_sp.get()函數的結果?或者如果沒有,檢查a_spNULL如何?定義將shared_ptr中的某個函數轉換爲布爾值嗎?

回答

14

shared_ptr有一個operator unspecified-bool-type() const允許它在布爾上下文中使用。 unspecified-bool-type通常被定義爲指向函數的指針或指向成員函數的指針,以禁止意外匹配bool函數重載。

C++0x成語是使用explicit operator bool() const;,它不允許隱式轉換(如函數調用,轉換到int用於算術,等等),但仍允許shared_ptr要轉換在布爾值的上下文爲bool。

+0

Mankarse:這個語法是什麼'operator unspecified-bool-類型()'。我以前沒見過這個。這是什麼特別的提升? –

+0

unspecified-bool-type僅代表實際類型,如bool。這個語法不是一個特別的提升,它是聲明「類型轉換運算符」的語法。查看[wikibooks](http://en.wikibooks.org/wiki/C++_Programming/Operators/Operator_Overloading#Conversion_operators) – Mankarse

+0

Mankarse:太棒了。感謝您的鏈接。 –

2

shared_ptr有operator bool(),如果它不爲空則返回true。

例如,這是微軟實施的shared_ptr ::運算布爾():http://msdn.microsoft.com/en-us/library/bb982901.aspx

的shared_ptr ::運算布爾型 - 如果所有的資源是否存在的試驗。

+0

謝謝Alex。 –

+1

這只是概念上正確的,但實際上並非如此:http://www.artima.com/cppsource/safebool.html;但可以通過顯式轉換運算符來解決:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2435.htm –