Как работает 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 - Проверяет, существует ли собственный ресурс.