C++中的std::move是干嘛用的?它真的实现数据移动功能吗?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1171个文字,预计阅读时间需要5分钟。
它不处理数据,也不执行任何移动逻辑,只是将左值强制转换为右值引用类型,便于后续的移动构造函数或移动赋值运算符调用。没有对象接收这个右值引用,因此使用`std::move`就没什么效果。
常见错误现象:std::move(x) 后 x 还能用、值没变、甚至还能继续调用成员函数——这完全正常,因为 std::move 本身不修改 x,只是“告诉编译器:我允许你把它当可移动对象处理”。
- 真正移动发生在目标类型的移动构造函数里(比如
std::vector的移动构造会把原始指针接管过来,再把原对象的指针置空) - 如果类型没定义移动构造函数,
std::move(x)会退化为拷贝(调用拷贝构造) - 对内置类型(如
int、double)用std::move没意义,编译器通常直接优化掉
什么时候必须用 std::move?
只有当你明确想把一个具名对象“交出去”,且该对象后续不再使用时,才需要它。典型场景是实现移动语义的类成员函数,或者在返回局部对象时避免冗余拷贝。
本文共计1171个文字,预计阅读时间需要5分钟。
它不处理数据,也不执行任何移动逻辑,只是将左值强制转换为右值引用类型,便于后续的移动构造函数或移动赋值运算符调用。没有对象接收这个右值引用,因此使用`std::move`就没什么效果。
常见错误现象:std::move(x) 后 x 还能用、值没变、甚至还能继续调用成员函数——这完全正常,因为 std::move 本身不修改 x,只是“告诉编译器:我允许你把它当可移动对象处理”。
- 真正移动发生在目标类型的移动构造函数里(比如
std::vector的移动构造会把原始指针接管过来,再把原对象的指针置空) - 如果类型没定义移动构造函数,
std::move(x)会退化为拷贝(调用拷贝构造) - 对内置类型(如
int、double)用std::move没意义,编译器通常直接优化掉
什么时候必须用 std::move?
只有当你明确想把一个具名对象“交出去”,且该对象后续不再使用时,才需要它。典型场景是实现移动语义的类成员函数,或者在返回局部对象时避免冗余拷贝。

