如何给std::unique_ptr赋值
时间: 2024-12-24 07:38:18 浏览: 7
`std::unique_ptr`是一个智能指针,它的赋值默认是禁止的(即默认构造的赋值操作符`operator=`被删除),这是为了防止意外的深度复制,因为它内部保存的是原始资源的所有权。如果你想将一个`unique_ptr`的内容转移到另一个已经存在的`unique_ptr`实例,你应该使用移动构造或移动赋值操作。
1. **移动构造**:
```cpp
std::unique_ptr<T> ptr1(new T());
// ... 对ptr1做一些操作
std::unique_ptr<T> ptr2; // 空的unique_ptr
ptr2 = std::move(ptr1); // 将ptr1的所有权转移给ptr2
```
这里`std::move`实际上是告诉编译器这不是一个正常的赋值,而是一个资源的转移。
2. **移动赋值**:
```cpp
std::unique_ptr<T> ptr1(new T());
// ... 对ptr1做一些操作
std::unique_ptr<T> ptr2(new T());
ptr2 = std::move(ptr1); // 将ptr1的所有权转移给ptr2
```
如果你试图直接赋值给另一个`unique_ptr`,编译器会报错提示你不能这样做。如果需要共享所有权,你可以使用`shared_ptr`或者`weak_ptr`。如果你只是想临时转移控制权,而不是真正地改变所有者,那么`unique_lock`等RAII技术也是有用的工具。
阅读全文