Avatar ·

为什么可以从函数返回 std::unique_ptr 而不使用 std::move

你好!我最近开始学习 C++11 和智能指针,对 std::unique_ptr 感到困惑。我知道 unique_ptr 不能复制——只能移动。移动通常使用 std::move()。但我注意到一个奇怪的行为:当我编写一个创建并返回 unique_ptr 的函数时,即使我没有调用 std::move(),编译器也不会报错。 这是一个例子: ```cpp #include std::unique_ptr createInt() { std::unique_ptr ptr = std::make_unique(42); return ptr; // 没有 std::move()——但这能工作! } int main() { std::unique_ptr p = createInt(); return 0; } ``` 为什么这能编译?毕竟 unique_ptr 禁止复制!如果我尝试在另一个函数中对普通变量做同样的事情,例如: ```cpp void test() { std::unique_ptr a = std::make_unique(10); std::unique_ptr b = a; // 错误!复制被禁止。 } ``` ——这不会编译。区别在哪里?