成都网站建设设计

将想法与焦点和您一起共享

C++为什么不要返回右值引用

本篇内容主要讲解“C++为什么不要返回右值引用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++为什么不要返回右值引用”吧!

成都创新互联公司是一家集网站建设,荔湾企业网站建设,荔湾品牌网站建设,网站定制,荔湾网站建设报价,网络营销,网络优化,荔湾网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。

Reason(原因)

返回右值引用是在要求返回一个已经销毁的临时对象的引用。&&对于临时对象来说具有吸引力。

Example(示例)

返回的右值引用在所有表达式的最后一个返回时退出了有效范围。

auto&& x = max(0, 1);   // OK, so farfoo(x);                 // Undefined behavior

这种用法是bug的常见原因。经常被错误地报告为编译器错误。函数的实现者应该避免给使用者布置这样的陷阱。

The lifetime safety profile will (when completely implemented) catch such problems.

生命周期安全规则群组会(在完全实现的情况下)捕捉这样的问题。

Example(示例)

当引用的对象是向下(向内)传递给调用者时返回右值引用时会工作得很好。这种情况下可以保证临时变量的生命周期会长于函数调用(参见F.18和F.19)。然而,当将这个引用向上(向外)传递给更大的调用者空间时是有问题的。对于传递输入参数(通过原始引用或者完美的fowrard处理)而且需要返回值的透过型函数,使用简单的auto类型返回类型推断(不是auto&&)。

Assume that F returns by value:

假设F是通过值返回的:

templateauto&& wrapper(F f){    log_call(typeid(f)); // or whatever instrumentation    return f();          // BAD: returns a reference to a temporary}

Better(较好):

templateauto wrapper(F f){    log_call(typeid(f)); // or whatever instrumentation    return f();          // OK}
Exception(例外)

std::move和std::forward也会返回&&,但是按照惯例它们只是用于临时变量被销毁之前,它的引用在同一表达式内传递的情况。

Enforcement(实施建议)

Flag any use of && as a return type, except in std::move and std::forward.

标记使用&&做返回值类型的用法,除了std::move和std::forward。

到此,相信大家对“C++为什么不要返回右值引用”有了更深的了解,不妨来实际操作一番吧!这里是创新互联网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!


文章标题:C++为什么不要返回右值引用
浏览地址:http://chengdu.cdxwcx.cn/article/ieggcg.html