【C++】完美转发

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)); }     

完美转发实现了参数在函数调用传递(转发)过程中保持它的左值或者右值的属性不变。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值