c++ - qué es auto_ptr_ref, qué logra y cómo lo logra
stl auto-ptr (3)
La documentación auto_ptr_ref aquí dice esto
This is an instrumental class to allow certain conversions that allow auto_ptr objects to be passed to and returned from functions.
¿Alguien puede explicar cómo auto_ptr_ref ayuda a lograr esto? Solo quiero entender la clase auto_ptr y sus partes internas
Acabo de encontrar un enlace muy bueno y un nombre para esta técnica "Move Constructors" o "Colvin-Gibbons truco"
http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Move_Constructor
Como resultado, es posible almacenar punteros inteligentes en contenedores (por ejemplo, QMap) con la ayuda de auto_ptr_ref
. La única necesidad es inicializar auto_ptr_ref
desde auto_ptr
al insertar, y volver auto_ptr
desde auto_ptr_ref
para operar.
Es bastante confuso Básicamente, auto_ptr_ref
existe porque el constructor de copia auto_ptr
no es realmente un constructor de copia en el sentido estándar de la palabra.
Los constructores de copia suelen tener una firma que se ve así:
X(const X &b);
El constructor de copia auto_ptr
tiene una firma que se ve así:
X(X &b)
Esto se debe a que auto_ptr
necesita modificar el objeto que se está copiando para establecer su puntero en 0 para facilitar la semántica de propiedad de auto_ptr
.
A veces, los temporales no pueden coincidir con un constructor de copia que no declara su argumento const
. Aquí es donde entra en auto_ptr_ref
. El compilador no podrá llamar a la versión no const del constructor de copia, pero puede llamar al operador de conversión. El operador de conversión crea un objeto auto_ptr_ref
que es solo una especie de titular temporal para el puntero. El constructor auto_ptr
u operator =
se llama con el argumento auto_ptr_ref
.
Si se da cuenta, el operador de conversión en auto_ptr
que automáticamente se convierte en auto_ptr_ref
realiza un release
en el origen auto_ptr
, tal como lo hace el constructor de copia.
Es una especie de pequeño baile extraño que ocurre entre bastidores porque auto_ptr
modifica lo que se está copiando.
Tanget relacionado aleatorio sobre C ++ 0x y unique_ptr
En C ++ 0x, auto_ptr
está en desuso en favor de unique_ptr
. unique_ptr
ni siquiera tiene un constructor de copia y usa el nuevo ''move constructor'' que es explícito sobre el hecho de que modificará el objeto que se está moviendo y lo dejará en un estado inútil (pero aún válido). Los temporarios (también conocidos como rvalues) siempre pueden ser argumentos para un constructor de movimiento.
El constructor de movimiento en C ++ 0x tiene una serie de otros grandes beneficios. Permite a los contenedores STL estándar almacenar unique_ptr
sy hacer lo correcto, a diferencia de cómo auto_ptr
s no puede ser. También elimina en su mayoría la necesidad de la función ''intercambio'' ya que el propósito general de la función de intercambio suele ser un constructor de movimiento o un operador de asignación de movimiento que nunca lanza.
Cuál es la otra expectativa. El constructor de movimiento y el operador de asignación de movimiento (muy parecido a un destructor) nunca deben arrojar.