2011-08-29 10 views
10

En C++, puedo escribir algo como:¿Cómo funciona shared_ptr trabajar en si la condición

shared_ptr<A> a_sp = someFunctionReturningSharedPtr(); 
if (a_sp) { 
    cout << a_sp->someData << endl; 
} else { 
    cout << "Shared Pointer is NULL << endl; 
} 

¿Por qué if (a_sp) trabajo de verificación correctamente? a_sp no es un booleano, pero ¿cómo se verifica que sea verdadero o falso? ¿Cómo sabe la condición if para verificar el resultado de la función a_sp.get()? O si no lo hace, ¿cómo se verifica el NULL ity del a_sp? ¿Hay alguna función en shared_ptr definida que la convierta en valor booleano?

Respuesta

14

tiene un operator unspecified-bool-type() const que le permite ser utilizado en contextos booleanos. El unspecified-bool-type se define típicamente como un puntero a la función o un puntero a la función miembro, para no permitir la coincidencia accidental con las sobrecargas de la función bool.

En C++0x el idioma es utilizar explicit operator bool() const;, que no permite conversiones implícitas (tales como llamadas de función, las conversiones a int para la aritmética, y así sucesivamente), pero todavía permite que el shared_ptr para ser convertidos a bool en contextos booleanos.

+0

Mankarse: ¿Qué es esta sintaxis 'operator unspecified-bool- tipo() '. No he visto esto antes. ¿Es esto algo especial para impulsar? –

+0

unspecified-bool-type es solo un soporte para un tipo real, como bool. Esta sintaxis no es una mejora especial, es la sintaxis para declarar un "operador de conversión de tipo". Ver [wikibooks] (http://en.wikibooks.org/wiki/C++Programming/Operators/Operator_Overloading#Conversion_operators) – Mankarse

+0

Mankarse: Impresionante. Gracias por el enlace. –

2

shared_ptr tiene el operador bool(), que devuelve verdadero si no está vacío.

Por ejemplo, esta es la aplicación de Microsoft shared_ptr :: bool operador(): http://msdn.microsoft.com/en-us/library/bb982901.aspx

shared_ptr :: operador de tipo booleano - Comprueba si existe un recurso de propiedad.

+0

Gracias Alex. –

+1

Eso es conceptualmente correcto, pero no realmente: http://www.artima.com/cppsource/safebool.html; pero debe ser resuelto con operadores de conversión explícitos: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2435.htm –

Cuestiones relacionadas