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.