Por que é possível retornar std::unique_ptr de uma função sem std::move?
Olá! Recentemente comecei a estudar C++11 e smart pointers, e fiquei confuso com std::unique_ptr. Eu sei que unique_ptr não pode ser copiado — apenas movido. Para mover, normalmente se usa std::move(). Mas notei um comportamento estranho: quando escrevo uma função que cria e retorna um unique_ptr, o compilador não reclama, mesmo que eu não chame std::move().
Aqui está um exemplo:
```cpp
#include
std::unique_ptr createInt() {
std::unique_ptr ptr = std::make_unique(42);
return ptr; // Sem std::move() — e funciona!
}
int main() {
std::unique_ptr p = createInt();
return 0;
}
```
Por que isso compila? Afinal, unique_ptr proíbe cópia! Se eu tentar fazer o mesmo com uma variável comum em outra função, por exemplo:
```cpp
void test() {
std::unique_ptr a = std::make_unique(10);
std::unique_ptr b = a; // Erro! Cópia proibida.
}
```
— isso não compila. Qual é a diferença?