Avatar ·

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?