std::move用法

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