1.std:move
别看它的名字叫move,其实std:move并不能移动任何东西,**它唯一的功能是将一个左值/右值强制转化为右值引用,继而可以通过右值引用使用该值,配合移动构造函数使用,所以称为移动语义。**<br />std:move的作用:将对象的状态或者所有权从一个对象转移到另一个对象,只是转移,没有内存的搬迁或者内存拷贝所以可以提高利用效率,改善性能。<br />std::move基本等同于一个类型转换:static_cast<T&&>(lvalue);
vector的应用
//摘自https://zh.cppreference.com/w/cpp/utility/move
#include <iostream>
#include <utility>
#include <vector>
#include <string>
int main()
{
std::string str = "Hello";
std::vector<std::string> v;
//调用常规的拷贝构造函数,新建字符数组,拷贝数据
v.push_back(str);
std::cout << "After copy, str is \"" << str << "\"\n";
//调用移动构造函数,掏空str,掏空后,最好不要使用str
v.push_back(std::move(str));
std::cout << "After move, str is \"" << str << "\"\n";
std::cout << "The contents of the vector are \"" << v[0]
<< "\", \"" << 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个重载函数理解这两个方法
#include <iostream>
using namespace std;
template <typename T>
void functiontest(T &s) {
cout << "调用左值引用" << endl;
}
template <typename T>
void functiontest(T&& s) {
cout << "调用右值引用" << endl;
}
template <typename T>
void function(T&& arges) {
functiontest(forward<T>(arges));
}
int main()
{
int s = 125;
cout << "124为参数带入,";
functiontest(124);
cout << "变量s参数带入,";
functiontest(s);
cout << "变量s用std::move方法,";
functiontest(move(s));
//std::move: 功能将一个左值/右值, 转换为右值引用。
cout << "常量调用std::forward方法,";
function(125);
cout << "变量d调用std::forward方法,";
double d ;
function(d);
}