c++ stl auto-ptr

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



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.