1.std:move

  1. 别看它的名字叫move,其实std:move并不能移动任何东西,**它唯一的功能是将一个左值/右值强制转化为右值引用,继而可以通过右值引用使用该值,配合移动构造函数使用,所以称为移动语义。**<br />std:move的作用:将对象的状态或者所有权从一个对象转移到另一个对象,只是转移,没有内存的搬迁或者内存拷贝所以可以提高利用效率,改善性能。<br />std::move基本等同于一个类型转换:static_cast<T&&>(lvalue);

vector的应用

  1. //摘自https://zh.cppreference.com/w/cpp/utility/move
  2. #include <iostream>
  3. #include <utility>
  4. #include <vector>
  5. #include <string>
  6. int main()
  7. {
  8. std::string str = "Hello";
  9. std::vector<std::string> v;
  10. //调用常规的拷贝构造函数,新建字符数组,拷贝数据
  11. v.push_back(str);
  12. std::cout << "After copy, str is \"" << str << "\"\n";
  13. //调用移动构造函数,掏空str,掏空后,最好不要使用str
  14. v.push_back(std::move(str));
  15. std::cout << "After move, str is \"" << str << "\"\n";
  16. std::cout << "The contents of the vector are \"" << v[0]
  17. << "\", \"" << v[1] << "\"\n";

2. std::foward

std::forward通常是用于完美转发的,它会将输入的参数原封不动地传递到下一个函数中,这个“原封不动”指的是,如果输入的参数是左值,那么传递给下一个函数的参数的也是左值;如果输入的参数是右值,那么传递给下一个函数的参数的也是右值。
浅谈std::forward :https://zhuanlan.zhihu.com/p/92486757
C++11完美转发及实现方法详解: http://c.biancheng.net/view/7868.html
forword函数和&&两者配合起来用,在函数模板里使用

实现原理

要解读 std::forward 内部代码实现,需要先掌握万能引用和引用折叠的知识。

https://www.ttlarva.com/master/learn_cpp/02_forward.html#_3

代码示范

通过4个重载函数理解这两个方法

  1. #include <iostream>
  2. using namespace std;
  3. template <typename T>
  4. void functiontest(T &s) {
  5. cout << "调用左值引用" << endl;
  6. }
  7. template <typename T>
  8. void functiontest(T&& s) {
  9. cout << "调用右值引用" << endl;
  10. }
  11. template <typename T>
  12. void function(T&& arges) {
  13. functiontest(forward<T>(arges));
  14. }
  15. int main()
  16. {
  17. int s = 125;
  18. cout << "124为参数带入,";
  19. functiontest(124);
  20. cout << "变量s参数带入,";
  21. functiontest(s);
  22. cout << "变量s用std::move方法,";
  23. functiontest(move(s));
  24. //std::move: 功能将一个左值/右值, 转换为右值引用。
  25. cout << "常量调用std::forward方法,";
  26. function(125);
  27. cout << "变量d调用std::forward方法,";
  28. double d ;
  29. function(d);
  30. }

image.png