c++ - ¿Por qué std:: weak_ptr<> proporciona una conversión bool?
c++11 shared-ptr (1)
Std :: shared_ptr <> de C ++ 11 proporciona un tipo de operador bool.
operator unspecified-bool-type() const;
(No es un operator bool() const directo operator bool() const debido a los peligros de la conversión implícita de tipo bool ).
¿Por qué std :: weak_ptr <> tiene un operador similar? Me encuentro constantemente escribiendo
if( !wp.expired() )
cuando quiero escribir
if( wp )
¿Por qué no hay conversión bool para weak_ptr?
if(!wp.expired()) es casi siempre una comprobación errónea en el código de multiproceso, porque justo después de eso, la instrucción podría caducar. Como tal, si weak_ptr tuviera exactamente eso como semántica para la conversión bool , nunca se usaría de todos modos.
Si desea verificar si el puntero está activo, use el lock y verifique el shared_ptr obtenido.
Si desea saber si el puntero está muerto, utilice expired .
Como puede ver, simplemente no tiene sentido proporcionar una conversión booleana. Para shared_ptr , lo hace totalmente. Por cierto, el operador de conversión es explicit operator bool() const noexcept; en C ++ 11.