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?