欢迎来到天天文库
浏览记录
ID:39456503
大小:121.50 KB
页数:24页
时间:2019-07-03
《毕业设计外文资料翻译--右值引用 移动语义和完美转发》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、毕业设计外文资料翻译学院:专业班级:学生姓名:学号:指导教师:外文出处:《EffectiveModernC++》American.SMeyers附件:1.外文资料翻译译文;2.外文原文指导教师评语:该英文资料选择合理,翻译准确度较高,译文较为流畅。翻译工作认真细致,严格按照规定,翻译材料能与原文保持一致,能正确的表达出原文的意思,希望能够将细节部分处理得更加得当。签名:2015年10月14日1.外文资料翻译译文右值引用移动语义和完美转发当你刚开始学习移动语义和完美转发时,它们看起来并不复杂:•移动语义使编译器可以使用低消耗的移动代
2、替高消耗的拷贝操作,就像拷贝构造函数和拷贝赋值运算符让你控制对象的拷贝一样,移动构造函数和移动赋值运算符让你控制移动。同时,移动引入了只支持移动的类型,例如std::unique_ptr,std::futrue,和std::thread。•完美转发让我们可以写出接受任意数量参数的函数模板。并将这些参数转发给接受接受参数数量与传给转发函数的参数数量相同的函数。右值引用就像胶水一样讲两个不相关的特性结合在一起,它正是使移动语义和完美转发成为可能的底层语言机制。你对这些特性越发熟悉,你就越会意识到你刚开始的印象只不过是冰山一角。移动语义
3、、完美转发和右值引用的世界远比它们看起来要复杂的多。例如,std::move不移动任何东西,完美转发也并不完美。移动操作并不总比拷贝操作性能好;就算移动操作性能更好,它们的性能也不总是像预期的那样好,并且它们不总在可移动的上下文中调用。无论你如何深入理解这些特性,仍然会有意外的情况发生。幸运的是,它们的复杂度是有限的,本章会探究它们背后深层的机制,这部分C++将会十分好理解。你会知道std::move和std::forward的使用惯例,掌握"type&&"模糊不清的特质,理解移动操作令人惊讶的多种行为背后的原因。一切都将水到渠成
4、,到那时,你又回到了刚开始的时,移动语义、完美转发和右值引用依旧直截了当,但这次它们会一直这样。在本章的条款中,一件非常重要的事是牢牢记住参数始终是一个左值,即使传入的类型是右值引用(如果这让你惊讶,请再看一下第2页对左值和右值的概述)。条款23理解std::move和std::forward更好地了解std::move和std::forward的方法是先了解它们不做什么。std::move不移动任何东西,std::forward也并不转发任何东西。在运行时,它们都不做任何事,甚至一行可执行的代码都不产生。std::move和st
5、d::forward仅仅是执行类型转换的函数(实际上是函数模板)。std::move无条件地将它的参数转换为右值,而std::forward只在一定条件下才执行转换。就是这样,这样解释带来了新的疑问,不过这样已经大致概括了内容。为了更具体得解释,我们来看一个C++11中的sd:move的实现示例template//在命名空间std中typenameremove_reference::type&&move(T&¶m){usingReturnType=//别名声明typenameremove_ref
6、erence::type&&;//参见条款9returnstatic_cast(param);}我标出了代码中的两处,一处是函数名,因为返回类型十分繁杂,我不想让你在这复杂的地方浪费时间。另一处是构成了这个函数精髓的类型转换。正如你所看到的std::move接受一个对象的引用(更准确地说是一个universal引用,参见条款24),并返回这个对象的引用、函数返回类型中的"&&"表示std::move返回一个右值引用,但是正如条款28中解释得那样,如果类型T是一个左值引用,T&&就会变成左值引用。为了防
7、止这种事发生,typetrait(见条款9)std::remove_reference用在了T上。这使得"&&"一定会用在一个不是引用的类型上。这样能保证std::move一定返回一个右值引用。这很重要,因为函数返回的右值引用是一个右值,所以std::move所做所有事情就是将它的参数转换为右值。顺带一提,在C++14中std::move能被实现得更简便一些。多亏了函数返回值类型推导(参见条款3)以及标准库的别名模板std::remove_reference_t(参见条款9),std::move能被写成这样:template8、penameT>decltype(auto)move(T&¶m){usingReturnType=remove_reference_t&&;returnstatic_cast(param);}看上去更简单了,不
8、penameT>decltype(auto)move(T&¶m){usingReturnType=remove_reference_t&&;returnstatic_cast(param);}看上去更简单了,不
此文档下载收益归作者所有