Как работает shared_ptr, если условие

В С++ я могу написать что-то вроде:

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 не является логическим, но как он проверяется на true или false? Как узнать условие if, чтобы проверить результат функции a_sp.get()? Или, если это не так, как проверяется NULL ity a_sp? Есть ли определенная функция в shared_ptr, которая преобразует ее в значение boolean?

Ответ 1

shared_ptr имеет operator unspecified-bool-type() const, который позволяет использовать его в булевых контекстах. Необязательный-bool-тип обычно определяется как указатель на функцию или указатель на функцию-член, чтобы запретить случайное сопоставление с перегрузками функций bool.

В C++0x идиома должна использовать explicit operator bool() const;, которая запрещает неявные преобразования (такие как вызовы функций, преобразования в int для арифметики и т.д.), но все же позволяет преобразовать shared_ptr в bool в булевых контекстах.

Ответ 2

shared_ptr имеет оператор bool(), который возвращает true, если он не пуст.

Например, это реализация Microsoft shared_ptr:: operator bool(): http://msdn.microsoft.com/en-us/library/bb982901.aspx

shared_ptr:: operator boolean-type - Проверяет, существует ли собственный ресурс.