forward完美转发
是指在函数模板中,完全依照模板参数的类型,将参数传递给函数模板中调用的另一个函数。
模板的万能引用只是提供了能够接收同时接收左值引用和右值引用的能力,但是引用类型的唯一作用就是限制了接收的类型,后续使用中都退化成了左值,我们希望能够在传递(转发)过程中保持它的左值或者右值的属性, 即执行例二后输出右值。
目的: 数据是左值就转发成左值,右值就转发成右值。
自动的识别类型
void func2(int&& val) { cout << "右值" << endl; } // 右值引用函数
void func1(int&& val)
{
func2(std::forward<int>(val)); // val按照右值传递(转发)给func2函数,本质为类型转换为右值
}
完美转发原型:
// 完美转发原型:
T&& forward(T&& t) { return static_cast<T&&>(t); }
// 用法: template<typename T>
void func1(T && val) { func2(std::forward<T>(val)); }
// 当传入左值引用
void func1(T& && val) { func2(static_cast<T& &&>(val)); }
// 引用折叠后:
void func1(T& val) { func2(static_cast<T&>(val)); }
// 当传入右值引用
void func1(T&& && val) { func2(static_cast<T&& &&>(val)); }
// 引用折叠后:
void func1(T&& val) { func2(static_cast<T&&>(val)); }
完美转发实现了参数在函数调用传递(转发)过程中保持它的左值或者右值的属性不变。