c++ c++11 shared-ptr weak-ptr

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.