Saltar al contenido

¿Por qué std::unique_ptr reset no es lo mismo que asignación?

Después de tanto trabajar pudimos dar con la respuesta de este asunto que muchos lectores de esta web presentan. Si deseas aportar algo no dejes de compartir tu información.

Solución:

En primer lugar, std::unique_ptr p = new MyClass; no es asignación, es inicialización de copia. Y no funciona porque el constructor de std::unique tomar un puntero en bruto se marca como explicit:

explicit unique_ptr( pointer p ) noexcept;

se declara como explicit para evitar inesperado (podría ser peligroso) implícito conversiones, por ejemplo:

void foo(std::unique_ptr uptr);

int *rptr = new int;
foo(rptr); // suppose rptr is implicitly converted to std::unique_ptr
           // then the ownership is passed to the parameter uptr

// when foo() returns uptr is destroyed; the pointer managed by it is deleted too
// since rptr has been deleted continue to deference on it leads to UB
*rptr = 42; // UB

Tenga en cuenta que explicit los constructores no se consideran en la inicialización de la copia (p. ej. std::unique_ptr p = new MyClass;). Puede usarlos en la inicialización directa en su lugar (por ejemplo, std::unique_ptr p (new MyClass);). Se utilizan para prohibir conversiones implícitas, pero puede realizar conversiones explícitas. como el uso de resettienes que hacer estas cosas explícitamentepara demostrar (y demostrarte) que estás bastante seguro de lo que estás haciendo.

Por cierto: la asignación del puntero sin procesar tampoco funciona, porque std::unique_ptr no tiene un operador de asignación sobrecargado que tome un puntero sin formato como parámetro. Por el motivo anterior, el puntero sin formato no puede ser implícitamente convertido a std::unique_ptrpor lo que el operador de asignación de movimiento (que toma std::unique_ptr como parámetro) tampoco serán considerados.

Estoy tratando de entender por qué
std::unique_ptr p = new MyClass;
No funciona

La misma razón que mencionó @songyuanyao, donde se declara explicitdice que aún puede inicializarlo en un diferente forma de inicialización que supera explicit:

// Valid, since now it's 'explicit'
std::unique_ptr p  new MyClass ;

valoraciones y comentarios

Recuerda algo, que tienes el privilegio agregar una reseña si te fue preciso.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *