C++11中的完美转发
创始人
2024-05-19 10:06:10
0

C++11中的完美转发

在讨论引用折叠这个话题之前,先回顾一下C++11中的引用,

在C++11中引用有4种:非常量左值引用非常量右值引用常量左值引用常量右值引用。其中常量右值引用没有应用价值,所以我们不考虑。

  1. 非常量左值引用只能绑定非常量左值
  2. 非常量右值引用只能绑定非常量右值
  3. 常量左值引用又称万能引用,他能绑定所有值,但是不能修改被绑定的值
  4. 常量右值引用能绑定右值,但是不能修改被绑定的值(没有实用价值)

我们在模板中经常会调用另一个模板函数或者函数,我们希望我们能够在传参时,减少临时对象的产生,即我们总是希望按照引用传参,这时我们就提出了完美转发的概念。

template 
void foo(T t)
{run(t);
}

1.引用折叠

typedef const int T;
typedef T& TR;
typedef TR&& TRRR;
TRRR&& a=1;

上面这段代码在C++98中是无法编译的, 而在C++11中却是可以通过的,TRRR &&的类型会被推导为const int &

下面给出具体的折叠规则:

typedef T& TR;
TR v;//T&
TR &v;//T&
TR && v;//T&typedef T&& TR;
TR v;//T&&
TR & v;//T&
TR && v;//T&&

即左值引用和右值引用在折叠的时候,优先折叠为左值引用

2.完美转发

#include
using namespace std;
void run(int &&m)
{cout<<"rvalue reference\n";
}
void run(int &m)
{cout<<"lvalue reference\n";
}void run(const int &m)
{cout<<"const lvalue reference\n";
}
void run(const int &&m)
{cout<<"const rvalue reference\n";
}template 
void foo( T &&t)
{run(static_cast(t));
}
int main()
{int a;foo(a);foo(move(a));const int b=1;foo(b);foo(move(b));}
lvalue reference
rvalue reference
const lvalue reference
const rvalue reference

我们看一下,这个模板函数foo中实现的就是完美转发

template 
void foo( T &&t)
{run(static_cast(t));
}

如果a是个X类型的左值,那么T会被推导为X&,则模板实例化为

void foo( X& && t)
{run(static_cast(t));
}

根据引用折叠理论,上面就会变成左值引用

而如果a是个右值,那么T就会被推导为X,则模板实例化为

void foo( X&& t)
{run(static_cast(t));
}

所以不管我们传递的是左值还是右值,run中都是按照引用传递的,这就是完美转发。实际上,真正奏效的是static_cast()函数,它根本解决的是右值引用本身是个左值,所以得把他转化成右值这件事,
我们会发现,它做的事情和std::move()是一样的事情,但是为了后续区分,我们一般实用forward()函数来代替static_cast
注意,move()forward()的区别在于,move是无条件转化为右值,而forward是当且仅当它是右值引用变成的,而且我们要提供模板参数T,用以告知参数的原来类型。

完美转发的应用在于包装函数

#include
using namespace std;void func1(int &&)
{cout<<"func1"<cout<<"func2"<
void foo( T &&t, U& func)
{func(forward(t));
}
int main()
{foo(1,func1);foo(2,func2);
}

上面这种设计就是封装多个函数为一个函数,在C++11中make_pairmake_unique都是用上面这种方式实现的

上一篇:Python调用lua

下一篇:TII投稿时间线

相关内容

热门资讯

在中国肥胖日 见证一场三甲医院... 转自:千龙网新华社上海5月11日电(记者袁全、许东远)“工作太忙,没时间运动。”“下班了,我只想‘躺...
防盗网、铁栅栏、广告牌……南岗... 近日,南岗区消防救援大队联合区应急局、区城管局、区执法局、属地街道办事处和公安派出所等部门,以学府东...
拓邦股份与SAX Power正... 人民财讯5月11日电,近日,备受瞩目的The Smarter E Europe德国能源展落下帷幕,拓...
汽车车门把手将迎来国家标准,会... 汽车车门把手标准,不仅是技术问题、设计问题,更是安全问题。 5月8日至6月7日...
痛悼!中国工程院院士、国医大师... 今天(5月11日),石学敏同志治丧委员会发布讣告:中国工程院院士石学敏,因病医治无效,于2025年5...
微信、抖音、淘宝、快手集体公告... 近日,抖音、微信、淘宝、快手等多个平台接连发布公告,拦截、下架一批违规微短剧。━━━━━微信5月7日...
【行业深度】洞察2025:中国... 转自:前瞻产业研究院行业主要上市公司:北方稀土(600111);中国稀土(000831);广晟有色(...
11死37伤,斯里兰卡突发一客... 据央视新闻消息,当地时间5月11日,斯里兰卡中央省发生一起车祸,一辆客车坠入悬崖,目前已造成11人死...
新疆发现战国至秦汉时期大型墓群 中新网新疆托克逊5月11日电 (史玉江)“这片墓葬群有两个区域,共有墓葬两百余座,是目前吐鲁番盆地保...
北京经开区工业科技旅游三年行动... 新京报讯(记者吴婷婷)走进机器人“大家庭”感受未来世界、在航天企业开启逐梦太空之旅、坐上自动驾驶车辆...
长沙一金丝楠木展厅突起火,当地... 5月10日下午,湖南省长沙市开福区潮宗街金丝楠木展厅着火,里面陈设的文创品被付之一炬。5月11日,华...
2031年女足世界杯将增至48...   本报讯(记者赵晓松)昨天,国际足联在官网发布公告,确认自2031年起,女足世界杯决赛阶段参赛球队...
马克龙称法英正与乌克兰商议“在...   新华社北京5月11日电 法国总统埃马纽埃尔·马克龙10日表示,法国正在与英国、乌克兰方面商讨向乌...
红星资本局5月11日消息,苹果... #苹果再次降价降幅超1000元# 红星资本局5月11日消息,苹果再次宣布降价,降幅超1000元。据...
“四年制”幼儿园上路 作 者丨王峰编 辑丨陈洁图 源丨新华社作为促进生育政策的重要部分,托育一体化正在各地疾进。今年政府工...
大跳水,暴跌40%!老板:一天... 转自:钱江晚报夏天快来了“日啖荔枝三百颗,不辞长作岭南人”的时节又到了价格大跳水!暴跌40% 近日,...
原创设计、多元化定制……关税战... 转自:中央广播电视总台中国之声  浙江义乌,作为全球最大的“国外节日礼物用品”集散地,每年有数十亿美...
“上海地铁口现房总价45万”?... 本文转自【法治网】;上海闵行地铁口现房,首付5万总价45万,买一层得上下两层;上海徐汇交通大学70年...
2025 款斯柯达ENYAQ ... IT之家 5 月 11 日消息,斯柯达现已在海外公布2025款 ENYAQ vRS掀背车官图,该车定...
全店下架!“给小孩喂粽子,发现... 5月10日,有江苏的消费者连发两条视频投诉在来伊份的粽子中吃出疑似带血创可贴的异物。该消费者在视频中...