C++11 引入的移动语义是继智能指针之后最重要的语言特性。它从根本上解决了不必要的拷贝开销,让 C++ 的性能达到了新的高度。理解移动语义,是掌握现代 C++ 的关键一步。

左值与右值

左值是有明确内存地址、可以取地址的表达式。右值是临时对象、字面量等无法取地址的表达式。C++11 在此基础上引入了"将亡值"的概念:

std::string s1 = "hello";
std::string s2 = std::move(s1);  // s1 的内容被移动到 s2
// s1 现在处于"有效但未指定"的状态

std::move 的本质

std::move 并不移动任何东西——它只是一个类型转换,将左值无条件转换为右值引用。真正的移动操作由移动构造函数或移动赋值运算符完成。

完美转发

std::forward 与通用引用配合,实现参数的完美转发——左值作为左值转发,右值作为右值转发。

template<typename T, typename... Args>
std::unique_ptr<T> make_unique_wrapper(Args&&... args) {
    return std::make_unique<T>(std::forward<Args>(args)...);
}

返回值优化

在返回局部对象时,编译器会应用 RVO/NRVO,直接在调用方的内存位置构造对象,完全消除拷贝和移动。从 C++17 起,RVO 是强制要求的。

移动语义让 C++ 在表达力与性能之间达到了完美的平衡。