移动语义详解
00:00
C++移动语义详解:移动构造、移动赋值、std::move与右值引用。
1. 左值与右值
int x = 42; // x 是左值
int&& r = 42; // 42 是右值,r 是右值引用
2. 移动构造与移动赋值
class Buffer {
int* data_;
size_t size_;
public:
// 移动构造
Buffer(Buffer&& other) noexcept
: data_(other.data_), size_(other.size_) {
other.data_ = nullptr;
other.size_ = 0;
}
// 移动赋值
Buffer& operator=(Buffer&& other) noexcept {
if (this != &other) {
delete[] data_;
data_ = other.data_;
size_ = other.size_;
other.data_ = nullptr;
other.size_ = 0;
}
return *this;
}
};
3. std::move
std::vector<int> a = {1, 2, 3};
std::vector<int> b = std::move(a);
// a 现在为空(有效但未指定状态)
// b 拥有原来的数据
std::move 本身不移动任何东西,只是将左值转为右值引用。
4. 完美转发
template<typename T, typename... Args>
auto make_unique(Args&&... args) {
return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
}