std::move的作用是将对象转换为右值引用,触发移动语义。它不真正移动数据,而是通过static_cast将对象转为右值引用类型,使编译器启用资源转移机制。类需定义移动构造函数和移动赋值操作符来实现资源窃取,如指针转移并置空原指针。常见于临时对象、容器扩容、智能指针等场景,移动后原对象处于合法但未定义状态,const对象不可移动。

std::move 的作用是将一个对象转换为右值引用,从而触发移动语义。它本身并不真正“移动”数据,而是通过类型转换让编译器知道:这个对象的资源可以被安全地“窃取”,而不是进行开销较大的深拷贝。
std::move 的本质是类型转换
std::move 实际上是一个简单的模板函数,定义在
constexpr typename std::remove_reference
move(T&& arg) noexcept {
return static_cast
}
关键点在于返回类型:typename std::remove_reference
移动语义的核心:资源转移而非复制
当一个对象被 move 之后,它的资源(如指针、句柄等)会被“转移”到另一个对象,原对象进入“合法但未定义状态”。常见场景包括:
立即学习“C++免费学习笔记(深入)”;
- 临时对象的赋值或返回
- 容器扩容时元素的迁移
- 智能指针所有权的转移
例如 std::vector 在重新分配内存时,会优先尝试调用移动构造函数来转移元素,而不是复制,大幅减少内存和性能开销。
移动构造函数与移动赋值操作符
要支持移动语义,类需要显式定义移动构造函数和移动赋值操作符:
class MyString {public:
MyString(MyString&& other) noexcept {
data = other.data;
size = other.size;
other.data = nullptr; // 防止原对象析构时释放资源
other.size = 0;
}
MyString& operator=(MyString&& other) noexcept {
if (this != &other) {
delete[] data;
data = other.data;
size = other.size;
other.data = nullptr;
other.size = 0;
}
return *this;
}
private:
char* data;
size_t size;
};
移动后,原对象的数据指针被置空,确保不会重复释放内存。
什么时候会触发移动?
以下情况通常会触发移动语义:
- 返回局部对象(NRVO 不适用时)
- 使用 std::move 手动转换
- 异常对象传递
- 标准库容器操作(如 push_back(std::move(obj)))
注意:const 对象不会被移动,因为不能修改其内部状态。
基本上就这些。std::move 是一个轻量级的类型转换工具,真正的移动行为由类的移动构造函数决定。理解这一点,就能更好掌握 C++11 的资源管理机制。











