[C++]C++11右值引用李正浩

左值和右值的概念1、左值和右值是表达式的属性,一些表达式要求生成左值,一些表达式要求生成右值;左值表达式通常是一个对象的身份,而一个右值表达式表示的是对象的值。2、左值持久,右值短暂,右值只能绑定到临时对象,所引用的对象即将销毁并且该对象没有其他用户,由此可知,使用右值引用的代码可以自由地接管所引用的对象的资源。

右值引用是C++11中最重要的新特性之一,它解决了C++中大量的历史遗留问题,使C++标准库的实现在多种场景下消除了不必要的额外开销(如std::vector,std::string),也使得另外一些标准库(如std::unique_ptr,std::function)(可以想象,如果没有右值引用,uniqueptr要如何实现资源所有权的转让?)成为可能。即使你并不直接使用右值引用,也可以通过标准库,间接从这一新特性中受益。

vectorstr_split(conststring&s){vectorv;//...returnv;//v是左值,但优先移动,不支持移动时仍可复制。}如果函数按值返回,return语句又直接返回了一个栈上的左值对象(输入参数除外)时,标准要求优先调用移动构造函数,如果不符再调用拷贝构造函数。尽管v是左值,仍然会优先采用移动语义,返回vector从此变得云淡风轻。此外,无论移动或是拷贝,可能的情况下仍然适用编译器优化,但语义不受影响。对于std::unique_ptr来说,这简直就是福音。

unique_ptrcreate_obj(/*...*/){unique_ptrptr(newSomeObj(/*...*/));ptr->foo();//一些可能的初始化returnptr;}当然还有更简单的形式unique_ptrcreate_obj(/*...*/){returnunique_ptr(newSomeObj(/*...*/));}在工厂类中,这样的语义是非常常见的。返回unique_ptr能够明确对所构造对象的所有权转移,特别的,这样的工厂类返回值可以被忽略而不会造成内存泄露。上面两种形式分别返回栈上的左值和右值,但都适用移动语义(unique_ptr不支持拷贝)。接收右值表达式没有移动语义时,以表达式的值(例为函数调用)初始化对象或者给对象赋值是这样的:

MyObj::MyObj(){for(...){vec.push_back(newT());}//...}MyObj::~MyObj(){for(vector::iteratoriter=vec.begin();iter!=vec.end();++iter){if(*iter)delete*iter;}//...}繁琐暂且不说,异常安全也是大问题。使用vector

完美转发

假设有一个函数foo,我们写出如下函数,把接受到的参数转发给foo:

templatevoidfwd(TYPEt){foo(t);}我们一个个来分析:

如果TYPE是T的话,假设foo的参数引用类型,我会修改传进来的参数,那么fwd(t)和foo(t)将导致不一样的效果。如果TYPE是T&的话,那么fwd传一个右值进来,没法接受,编译出错。如果TYPE是T&,而且重载个constT&来接受右值,看似可以,但如果多个参数呢,你得来个排列组合的重载,因此是不通用的做法。你很难找到一个好方法来实现它,右值引用的引入解决了这个问题,在这种上下文时,它成为forwardingreference。这就涉及到两条原则。第一条原则是引用折叠原则:

A&&折叠成A&A&&&折叠成A&A&&&折叠成A&A&&&&折叠成A&&第二条是特殊模板参数推导原则:

1.如果fwd传进的是个A类型的左值,那么T被决议为A&。2.如果fwd传进的是个A类型的右值,那么T被决议为A。

将两条原则结合起来,就可以实现完美转发。

Ax;fwd(x);//推导出fwd(A&&&)折叠后fwd(A&)Afoo();fwd(foo());//推导出fwd(A&&&&)折叠后fwd(A&&)std::forward应用于forwardingreference,代码看起来如下:templatevoidfwd(T&&t){foo(std::forward(t));}要想展开完美转发的过程,我们必须写出forward的实现。接下来就尝试forward该如何实现,分析一下,std::forward是条件cast的,T的推导类型取决于传参给t的是左值还是右值。因此,forward需要做的事情就是当且仅当右值传给t时,也就是当T推导为非引用类型时,forward需要将t(左值)转成右值。forward可以如下实现:

templateT&&forward(typenameremove_reference::type&t){returnstatic_cast(t);}现在来看看完美转发是怎么工作的,我们预期当传进fwd的参数是左值,从forward返回的是左值引用;传进的是右值,forward返回的是右值引用。假设传给fwd是A类型的左值,那么T被推导为A&:

voidfwd(A&&&t){foo(std::forward(t));}forward实例化:A&&&forward(typenameremove_reference::type&t){returnstatic_cast(t);}引用折叠后:

A&forward(A&t){returnstatic_cast(t);}可见,符合预期。再看看传入fwd是右值时,那么T被推导为A:

voidfwd(A&&t){foo(std::forward(t));}forward实例化如下:

A&&forward(typenameremove_reference::type&t){returnstatic_cast(t);}

THE END
1.生态循环利用和废物利用概念在平面样式mov格式视频下载摄图新视界>视频>科技>生态循环利用和废物利用概念在平面样式.mov % buffered00:00 00:00 00:00 1x 4x 2x 1.5x 1x 0.5x ID:00hwbr 授权范围 商业用途,可用于营利性的商业、广告目的 授权限制 暂无 版权所有 摄图网已取得Depositphotos授权 720P1280 x 720px , mov https://xsj.699pic.com/shipin/00hwbr.html
2.四通股份是不是废物利用概念股?四通股份市值是多少(7月11日)企业盈利 四通股份 概念股 广东省 广东四通集团股份有限公司 2023-07-11 18:42 来源: 南方财富网 截止收盘,四通股份报5.880元,涨0.34%,总市值18.82亿元。 四通股份是废物利用概念股。 2022年净利润-2605.83万,同比增长-180.84%。 四通股份,股票代码603838)是一家集研发、设计、生产、销售于一体的新型家居生活陶https://aiqicha.baidu.com/yuqing?yuqingId=f98bde60b403c5a24a98900b472b10da
3.关于循环经济及其立法的若干问题今天围绕循环经济及其立法,介绍三方面的内容:一是循环经济的概念、原理和评价原则;二是科学发展呼唤循环经济立法;三是循环经济立法的几点思考。 一、循环经济的概念、原理和评价原则 (一)循环经济的概念 循环经济,是指在生产、流通和消费等过程中进行的减量化、再利用、资源化活动的总称,也就是资源节约和循环利用活动http://www.npc.gov.cn/zgrdw/npc/xinwen/2007-07/02/content_368360.htm
4.河南省危险废物规范化管理工作指南本指南适用于我省危险废物产生单位和经营单位危险废物规范化管理以及环境保护主管部门依照国家有关法律法规、政策规定对危险废物产生单位和经营单位进行的监督管理。 1.2 术语概念 固体废物,是指在生产、生活和其他活动中产生的丧失原有利用价值或者虽未丧失利用价值但被抛弃或者放弃的固态、半固态和置于容器中的气态的物品http://yxy.henu.edu.cn/info/1102/3932.htm
5.关于空气污染调研报告模板(优秀9篇)分类丢弃,不仅仅废物利用、减少污染,也节约资源;让奶奶买菜时,少用塑料袋,尽量用竹篮子,让爸爸外出吃饭尽量不用一次性饭盒打包,自我做到不随地吐痰,不乱丢纸屑。 空气污染调研报告 9 一、大气污染的概念 大气是由必须比例的氮、氧、二氧化碳、水蒸气和固体杂质微粒组成的混合物。就干燥空气而言,按体积计算,在标准状https://www.baihuawen.cn/fanwen/daquan/661422.html
6.PM圈子:PM可收藏,华为内部流程管理体系详解突发!俄罗斯遭袭当地时间11日,俄罗斯国防部通报称,乌克兰武装力量利用6枚美制陆军战术导弹对位于罗斯托夫州塔甘罗格市的军用机场发动了袭击。 城市晚报 201评论 17小时前 金价大涨!还将继续涨,并再创新高!金价又涨了!国际金价回升,突破2700美元/盎司,刷新近两周新高。12月12日,受美通胀数据放缓催化,降息预期大幅提https://www.toutiao.com/w/7212885326648460067/
7.创新创业项目计划书范文(精选13篇)5、大学生厨房室内的装饰:可由学生来创造设计,设计核心为自由舒适,绿色环保。主要体现简单美。大学生自己种的花草,手工剪贴画,废物利用等些有创意的设计都可用来装饰大学生厨房。 三、组织人员管理 1、我们将顾客分为大、中、小规模。 大规模(20—40人):如某班同学聚会,或者是某同学的生日,这样需要出租一个单元https://www.ruiwen.com/word/chuangxinchuangyexiangmujihuashufw.html