前置知识: C++

移动语义详解

1 minAdvanced2026/6/14

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)...));
}