2011-08-29 12 views
10

W C++, mogę napisać coś takiego:Jak shared_ptr działa, jeśli stan

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

Dlaczego if (a_sp) działa Sprawdź poprawnie? a_sp nie jest wartością boolowską, ale w jaki sposób jest sprawdzana pod kątem wartości true lub false? W jaki sposób warunek if sprawdza wynik działania funkcji a_sp.get()? A jeśli nie, w jaki sposób sprawdzana jest wartość NULL? Czy istnieje określona funkcja shared_ptr, która przekształca ją w wartość boolowską?

Odpowiedz

14

shared_ptr ma operator unspecified-bool-type() const, który pozwala na użycie go w kontekstach logicznych. nieokreślony typ bool jest zwykle definiowany jako wskaźnik do funkcji lub wskaźnik do funkcji-członka, aby uniemożliwić przypadkowe dopasowanie do przeciążenia funkcji bool.

W C++0x idiom jest użycie explicit operator bool() const;, które wykluczy ukryte konwersji (takich jak połączenia funkcyjnych, konwersje int arytmetyczne, i tak dalej), ale pozwala na shared_ptr być przekształcany do BOOL kontekstach logicznych.

+0

Mankarse: Czym jest ten operator składni "nieokreślony-boolowy" type() '. Nie widziałem tego wcześniej. Czy jest to coś szczególnego do wzmocnienia? –

+0

nieokreślony-bool-type jest po prostu podstawą dla rzeczywistego typu, takiego jak bool. Ta składnia nie jest specjalną cechą doładowania, jest to składnia deklarująca "operator konwersji typów". Zobacz [wikibooks] (http://pl.wikibooks.org/wiki/C++_Programming/Operators/Operator_Overloading#Conversion_operators) – Mankarse

+0

Mankarse: Awesome. Dzięki za link. –

2

shared_ptr ma operator bool(), który zwraca wartość true, jeśli nie jest pusta.

Na przykład, jest to implementacja Microsoft od shared_ptr :: bool operator(): http://msdn.microsoft.com/en-us/library/bb982901.aspx

shared_ptr :: operator logiczna typu - Testy jeśli własność zasobu istnieje.

+0

Dziękuję Alex. –

+1

To tylko poprawne koncepcyjnie, ale nie w rzeczywistości: http://www.artima.com/cppsource/safebool.html; ale to musi zostać naprawione za pomocą operatorów konwersji jawnej: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2435.htm –

Powiązane problemy