为什么可以从函数返回 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; // 错误!复制被禁止。
}
```
——这不会编译。区别在哪里?