c++ auto-ptr

c++ - ¿Por qué auto_ptr<T> no tiene operador!() Definido?



auto-ptr (4)

En pocas palabras, debe tener operator !() Definido. auto_ptr no es un contenedor muy bien diseñado. Los punteros inteligentes en impulso tienen el operator bool() operador de conversión definido que se puede negar con operator !() . Eso permitirá que tu if(!p) compile y funcione como se espera.

El Título resume bastante bien mi pregunta. ¿Por qué no se puede hacer lo siguiente para verificar si hay un puntero nulo?

auto_ptr<char> p( some_expression ); // ... if ( !p ) // error

Esto debe hacerse en su lugar:

if ( !p.get() ) // OK

¿Por qué auto_ptr<T> simplemente no tiene operator!() Definido?


Hay un problema con la conversión booleana. Permite sintaxis que casi siempre son un dolor.

Hay, afortunadamente, una solución: el lenguaje Safe Bool .

El problema con una conversión a bool es que la conversión implícita es peligrosa.

std::auto_ptr<T> p = ..., q = ....; if (p < q) // uh ?

Por lo tanto, el operator bool() const es una abominación. O bien proporciona un método explícito ... o usa el lenguaje bool seguro.

La idea de la expresión idiomática es darle una instancia de un tipo con un subconjunto de operaciones bastante mínimo y casi en ningún caso en el que la conversión implícita le causará problemas. Esto se hace usando un puntero a la función miembro.

Las operaciones como if (p) y if (!p) tienen sentido, pero if (p < q) no se compilan.

Lea detenidamente el enlace para obtener la solución completa, y se dará cuenta de por qué fue una buena idea no tener el operator bool() const .


Parece que hubo un error en su diseño. Esto se solucionará en C ++ 0x. unique_ptr (reemplazo de auto_ptr ) contiene explicit operator bool() const;

Cita del nuevo estándar de C ++:

La plantilla de clase auto_ptr está en desuso. [Nota: La plantilla de clase unique_ptr (20.9.10) proporciona una mejor solución. "Nota final"

Algunas aclaraciones:
P: ¿Qué pasa con a.get() == 0 ?
R: No hay a.get()==0 con a.get()==0 , pero los punteros inteligentes le permiten trabajar con ellos como si fueran punteros reales. operator bool() adicional operator bool() le da esa opción. Creo que la verdadera razón para hacer que auto_ptr desuso es que no tiene un diseño intuitivo. Pero el operator bool for unique_ptr en el nuevo estándar significa que no hay razones para no tenerlo.


Sospecho que se esperaba que pasar de auto_ptr s a null sería un caso poco frecuente, para evitar agregar una interfaz adicional y hacerlo explícito cuando en realidad se está comprobando el valor nulo.