网站主页不收录,wap网站html5,单页面网站教程,天津seo外包团队完美转发是指在函数模板中#xff0c;完全依照模板的参数的类型#xff0c;将参数传递给函数模板中调用的另外一个函数。 函数模板在向其他函数传递自身形参时#xff0c;如果相应实参是左值#xff0c;它就应该被转发为左值#xff1b;如果相 应实参是右值#xff0c;它… 完美转发是指在函数模板中完全依照模板的参数的类型将参数传递给函数模板中调用的另外一个函数。 函数模板在向其他函数传递自身形参时如果相应实参是左值它就应该被转发为左值如果相 应实参是右值它就应该被转发为右值。这样做是为了保留在其他函数针对转发而来的参数的左右值属性进行不同处理比如参数为左值时实施拷贝语义参数为右值时实施移动语义。 std::forward完美转发标志 完美转发是为了解决传递参数时的临时对象右值被强制转换为左值的问题 forward会保持实参属性 实现
//目标/靶机
void target(int x){cout 左值目标 endl;}
void target(int x) { cout 右值目标 endl; }
void target(const int x) { cout const左值目标 endl; }
void target(const int x) { cout const右值目标 endl; }
templateclass T
void transferStation(T t){target(std::forwardT(t));}int main()
{transferStation(10);//右值目标int a;transferStation(a);//左值目标transferStation(std::move(a));//右值目标const int b 1;//const int b在C11中默认是左值transferStation(b);//const左值目标transferStation(std::move(b));//const右值目标return 0;
}
图像理解
总体思路 该段代码实现思路 没有对应目标函数
transferStation(abc);//报错没有可调用函数 此时经过forward检查后发现没有能使用的目标函数就会报错 区分万能引用标签和右值引用
//万能引用
templateclass T
void transferStation(T t){target(std::forwardT(t));}
//右值引用
void transferStation(int t) { cout 右值引用 t endl; }int main()
{transferStationint(10);//右值目标transferStation(10);return 0;
}
对不懂forwardT(t)的解释
class A1
{
public:void Print(){cout 无模板匿名对象 endl;}
private://...
};templateclass T
class A2
{
public:void Print(){cout 有模板匿名对象 endl;}
private://...
};int main()
{A1().Print();//无模板匿名对象A2int().Print();//有模板匿名对象return 0;
} 结果 结论 使用完美转发时有templateT需要改函数自己推演类型函数中的为万能引用 使用右值引用时不需要自动推演为固定模式此时为右值引用