专栏首页C++核心准则原文翻译C++核心准则编译边学-F.45 不要返回右值引用

C++核心准则编译边学-F.45 不要返回右值引用

F.45: Don't return a T&&

F.45:不要返回右值引用

Reason(原因)

It's asking to return a reference to a destroyed temporary object. A && is a magnet for temporary objects.

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

译者注:后面这句真没理解。

Example(示例)

A returned rvalue reference goes out of scope at the end of the full expression to which it is returned:

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

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

This kind of use is a frequent source of bugs, often incorrectly reported as a compiler bug. An implementer of a function should avoid setting such traps for users.

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

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

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

Example(示例)

Returning an rvalue reference is fine when the reference to the temporary is being passed "downward" to a callee; then, the temporary is guaranteed to outlive the function call (see F.18 and F.19). However, it's not fine when passing such a reference "upward" to a larger caller scope. For passthrough functions that pass in parameters (by ordinary reference or by perfect forwarding) and want to return values, use simple auto return type deduction (not auto&&).

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

Assume that F returns by value:

假设F是通过值返回的:

template<class F>
auto&& wrapper(F f)
{
    log_call(typeid(f)); // or whatever instrumentation
    return f();          // BAD: returns a reference to a temporary
}

Better(较好):

template<class F>
auto wrapper(F f)
{
    log_call(typeid(f)); // or whatever instrumentation
    return f();          // OK
}

Exception(例外)

std::move and std::forward do return &&, but they are just casts -- used by convention only in expression contexts where a reference to a temporary object is passed along within the same expression before the temporary is destroyed. We don't know of any other good examples of returning &&.

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

Enforcement(实施建议)

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

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

觉得本文有帮助?请分享给更多人。

关注【面向对象思考】,轻松学习每一天!

有任何疑问,欢迎留言提问或讨论。


面向对象设计,面向对象编程,面向对象思考!

本文分享自微信公众号 - 面向对象思考(OOThinkingDalian),作者:面向对象思考

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-11-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • C++核心准则F.51:如果可以,优先选择缺省参数而不是重载

    Default arguments simply provide alternative interfaces to a single implementati...

    面向对象思考
  • C++核心准则​Pro.bounds:边界安全群组

    This profile makes it easier to construct code that operates within the bounds o...

    面向对象思考
  • C++核心准则​NL.5:避免在名称中包含类型信息

    If names reflect types rather than functionality, it becomes hard to change the ...

    面向对象思考
  • 小型企业的持续集成搭建

    本文可能是网上最全的一篇全端jenkins部署解决方案介绍的文章,一直以来,领导都想解决代码提交和打包问题,尤其是小公司,打包流程混乱,造成线上版本和代码库gi...

    DevOps时代
  • 新冠期间的社交媒体动荡预测:神经隐性动机模式识别为严重危机的心理测量迹象

    COVID-19大流行已引起国际社会紧张和动荡。除了危机本身,有越来越多的迹象表明,世界各地社会冲突的可能性正在上升。全球情绪变化的指标很难发现,直接的问卷调查...

    甜甜圈
  • Educational Codeforces Round 81 (Rated for Div. 2) B - Infinite Prefixes

    You are given string s of length nn consisting of 0-s and 1-s. You build an infi...

    glm233
  • 运用地图生成的量子过程(CS AI)

    量子计算是一种新兴技术,它有望满足各种可能的用例。该承诺主要基于在未来十年内不太可能可行的算法。 对于近期应用,量子软件需要精心设计以适应可用的硬件。在本文中,...

    小童
  • 英特尔CPU软件防护扩展中的新缺陷

    两个独立的学术研究团队在周三发表了描述英特尔软件卫士扩展(SGX)中缺陷的论文。 SGX是一组指令,它通过允许开发人员将敏感信息划分为安全区域(内存中的执行区域...

    YH
  • deepmind 做通用人工智能的思路

    Automated discovery of early visual concepts from raw image data is a major open...

    用户1908973
  • 基于查询的链接数据访问控制(CS CS)

    近年来,我们已经看到了用于发布和使用链接数据的技术的重大进步。但是,为了在互连的机器可读数据之上支持下一代电子商务应用程序,需要放置适当形式的访问控制。尽管已经...

    刘子蔚

扫码关注云+社区

领取腾讯云代金券