2012-04-23 9 views
19

C++ 11 std :: shared_ptr <> proporciona un tipo de operador bool.¿Por qué std :: weak_ptr <> no proporciona una conversión bool?

operator unspecified-bool-type() const; 

(No es una recta de operator bool() const debido a la dangers from implicit casting de tipo bool.)

Por qué no std :: weak_ptr <> tienen un operador de similar? Me encuentro constantemente escribiendo

if(!wp.expired()) 

cuando quiero escribir

if(wp) 

Por qué hay conversión bool para weak_ptr?

+1

¿Porque las características no están implementadas por defecto? –

+1

'operator bool' ahora se puede realizar de forma segura directamente en C++ 11: http://stackoverflow.com/a/6242355/46642 –

Respuesta

28

if(!wp.expired()) es casi siempre una comprobación incorrecta en el código multiproceso, porque directamente después de esa declaración if el puntero podría caducar. Como tal, si weak_ptr tuviera exactamente eso como la semántica para la conversión bool, nunca se usaría de todos modos.

Si desea comprobar si el puntero está vivo, use lock y marque el shared_ptr obtenido.

Si quiere saber si el puntero está muerto, use 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.

+0

" * Si desea comprobar si el puntero está activo, use el bloqueo y el control el shared_ptr. * obtenido "Peligroso porque podría terminar descartando el último puntero fuerte al objeto, por lo que solo podría hacerlo en un contexto en el que fuera seguro invocar el destructor del objeto. –

+0

Sugeriría que cualquier contexto sea seguro para invocar el destructor de cualquier objeto, ya que los destructores deberían escribirse de manera que se puedan llamar de manera segura en cualquier momento (AIUI, este debe ser el caso para que el manejo de excepciones funcione en general caso, ya que desenrollar la pila podría destruir cualquier objeto arbitrario). Sin embargo, me interesaría un contraejemplo. – Keiji

Cuestiones relacionadas