Avatar ·

Por qué se puede devolver std::unique_ptr de una función sin std::move?

¡Hola! Recientemente comencé a estudiar C++11 y los smart pointers, y me surgió una confusión con std::unique_ptr. Sé que unique_ptr no se puede copiar, solo mover. Para moverlo normalmente se usa std::move(). Pero noté un comportamiento extraño: cuando escribo una función que crea y devuelve un unique_ptr, el compilador no se queja, incluso si no llamo a std::move(). Aquí hay un ejemplo: ```cpp #include std::unique_ptr createInt() { std::unique_ptr ptr = std::make_unique(42); return ptr; // Sin std::move() — ¡y funciona! } int main() { std::unique_ptr p = createInt(); return 0; } ``` ¿Por qué esto se compila? ¡Después de todo, unique_ptr prohíbe la copia! Si intento hacer lo mismo con una variable normal en otra función, por ejemplo: ```cpp void test() { std::unique_ptr a = std::make_unique(10); std::unique_ptr b = a; // ¡Error! Copia prohibida. } ``` — esto no se compila. ¿Cuál es la diferencia?