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
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
). Puede usarlos en la inicialización directa en su lugar (por ejemplo, std::unique_ptr
). Se utilizan para prohibir conversiones implícitas, pero puede realizar conversiones explícitas. como el uso de reset
tienes 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_ptr
por 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 explicit
dice 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.