me encontré con un error del compilador que no tiene mucho sentido para mí:Por qué no auto_ptr trabajos de construcción utilizando la sintaxis =
#include <memory>
using namespace std;
auto_ptr<Table> table = db->query("select * from t");
error: la conversión de 'Tabla *' de tipo no escalar ' std :: auto_ptr < Tabla>' pidió
Sin embargo, el trabajo siguiente línea hace:
auto_ptr<Table> table(db->query("select * from t"));
¿Qué hay en esta definiton del constructor que hace que no funcione como se esperaba? Pensé que las declaraciones inicializadas usaban los constructores.
Aquí está mi auto_ptr
's constructor (de la SGI STL):
explicit
auto_ptr(element_type* __p = 0) throw() : _M_ptr(__p) { }
Ugh. Justo cuando me convenzo a mí mismo de que he encontrado un uso para auto_ptr, su diseño me golpea en la cara. Volver a ir viejo eliminar. –
No deje caer auto_ptr solo por eso. Simplemente use el constructor explícito: auto_ptr
Hay una muy buena razón para que el constructor sea explícito. Lo protege de errores accidentales. Es bastante fácil poner el auto_ptr (...) alrededor. –
lothar
Es necesario utilizar
auto_ptr no define un operador de asignación por su tipo de plantilla. La única asignación permitida es de otro auto_ptr (y su constructor del puntero es explícito). Esto se hace para proteger el uso indebido accidental de auto_ptr, ya que auto_ptr asume la propiedad de la memoria.
Mi conjetura es que se necesita la forma de asignación de utilizar múltiples consultas tras otro como:
Fuente
2009-04-16 18:35:48 lothar
'¿Por qué no auto_ptr
Bueno, pensó que tú mismo (mira su pregunta). Y el formulario de asignación es necesario cada vez que haces más de una consulta tras otra :-) – lothar
Ojalá hubiera una forma de editar comentarios. usted - maldita escritura rápida ;-) – lothar
Agregando a lo Lothar dijeron: Porque el constructor
auto_ptr
se declara con la palabra claveexplicit
, se necesita usar un molde explícito para crear unauto_ptr
desde un puntero sin formato. (Antes de la introducción deexplicit
, la conversión implícita era la perdición de muchos desarrolladores de C++ nuevos y experimentados)Fuente
2009-04-16 18:39:28
El constructor se declara explícito, lo que significa que no se utilizará para la conversión de tipo implícito. La conversión implícita a auto_ptr podría llevar fácilmente a situaciones indeseables ya que auto_ptr toma posesión del puntero.
Por ejemplo, si auto_ptr permitiría la conversión implícita de un puntero y accidentalmente pasó un puntero a un método que toma un auto_ptr el puntero se convertiría silenciosamente a un auto_ptr y posteriormente se eliminaría cuando la función finaliza, incluso si eso no fuera así. la intención.Pero al marcar el constructor como una conversión explícita ya no puede suceder en silencio y al llamar al constructor, usted expresa claramente la intención de pasar la propiedad al auto_ptr, evitando así cualquier posible confusión.
Fuente
2009-04-16 19:01:12
Cuestiones relacionadas