std::move用法
std::move
std::move并不真正移动任何东西,它只是一个强制类型转换,将传入的对象转换为右值引用(具体为将亡值 xvalue),以便后续可以调用移动构造函数或移动赋值运算符。
典型用法:当确定某个左值不再需要其原始内容时,可以用 std::move将其资源“转移”给另一个对象。
std::string s1="hello";std::string s2=std::move(s1);// 调用 string 的移动构造函数// 此时 s1 处于有效但未指定的状态(通常是空字符串)必须注意:对左值使用 std::move后,原对象仍然存在,但其资源已被转移,不应再依赖其原有内容。
为什么需要右值引用和 std::move?
性能提升:对于管理动态资源的类(如 std::string, std::vector),移动操作只需交换指针/句柄,避免了昂贵的深拷贝。
唯一所有权传递:配合智能指针(如 std::unique_ptr)实现所有权的安全转移。
完美转发(与模板结合):通过 T&&保持参数的左/右值属性,结合 std::forward实现通用转发。
std::move的核心作用就是将左值(包括左值引用)强制转换为右值引用(而不能说是右值,对象本身还是那个对象,只是它的表达式现在具有右值属性,通常说“将左值转换为右值”是不严谨的,因为对象并未变成右值,而是它的值类别改变了),以便后续可以匹配移动构造函数或移动赋值运算符。
如果传入的是左值(如 int x),std::move(x)返回 int&&,即右值引用。
如果传入的是左值引用(如 int& y = x; std::move(y)),同样返回 int&&。
严格来说,std::move也可以接受右值(如 std::move(42)),但这样做没有实际意义,因为它已经是右值了。不过从语法上讲,它确实能接收任意值并返回对应的右值引用类型。
