【C++11】完美转发的使用

原文 http://blog.csdn.net/aqtata/article/details/35372769



完美转发(perfect forwarding)问题是指函数模板在向其他函数传递参数时该如何保留该参数的左右值属性的问题。

也就是说函数模板在向其他函数传递自身形参时,如果相应实参是左值,它就应该被转发为左值;同样如果相应实参是右值,它就应该被转发为右值。

这样做是为了保留在其他函数针对转发而来的参数的左右值属性进行不同处理(比如参数为左值时实施拷贝语义;参数为右值时实施移动语义)的可能性。

如果将自身参数不分左右值一律转发为左值,其他函数就只能将转发而来的参数视为左值,从而失去针对该参数的左右值属性进行不同处理的可能性。


一个完美转发的例子

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #include "stdafx.h"  
  2. #include <iostream>  
  3.   
  4. using namespace std;  
  5.   
  6. void fun(int &x) { cout << "lvalue ref" << endl; }  
  7. void fun(int &&x) { cout << "rvalue ref" << endl; }  
  8. void fun(const int &x) { cout << "const lvalue ref" << endl; }  
  9. void fun(const int &&x) { cout << "const rvalue ref" << endl; }  
  10.   
  11. template<typename T>  
  12. void PerfectForward(T &&t) { fun(std::forward<T>(t)); }  
  13.   
  14. int _tmain(int argc, _TCHAR* argv[])  
  15. {  
  16.     PerfectForward(10);           // rvalue ref  
  17.   
  18.     int a;  
  19.     PerfectForward(a);            // lvalue ref  
  20.     PerfectForward(std::move(a)); // rvalue ref  
  21.   
  22.     const int b = 8;  
  23.     PerfectForward(b);            // const lvalue ref  
  24.     PerfectForward(std::move(b)); // const rvalue ref  
  25.   
  26.     system("pause");  
  27.     return 0;  
  28. }  

可以看到,左右值属性完美地保留了。其核心就在std::forward这个模板函数。

关于完美转发更详细的深究,可以看看这篇博文,写的很详细:http://www.cnblogs.com/hujian/archive/2012/02/17/2355207.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值