专栏首页C++核心准则原文翻译C++核心准则编译边学-F.18 使用X&&传递“将会发生数据移动”的参数并实施数据移动

C++核心准则编译边学-F.18 使用X&&传递“将会发生数据移动”的参数并实施数据移动

F.18: For "will-move-from" parameters, pass by X&& and std::move the parameter(使用X&&传递“将会发生数据移动”的参数并实施数据移动)

Reason(原因)

It's efficient and eliminates bugs at the call site: X&& binds to rvalues, which requires an explicit std::move at the call site if passing an lvalue.

对于调用者可以提供高效和排除bug的可能性:X&&绑定一个右值,当调用者传递左值是需要使用清楚的std::move操作。

Example(示例)
void sink(vector<int>&& v) {   // sink takes ownership of whatever the argument owned
    // usually there might be const accesses of v here
    store_somewhere(std::move(v));
    // usually no more use of v here; it is moved-from
}

Note that the std::move(v) makes it possible for store_somewhere() to leave v in a moved-from state.That could be dangerous.

注意:std::move造成store_somewhere执行后,v变成移动后状态。这可能很危险。

译者注:危险在于移动后对象处于无效状态,一旦被使用则任何事情都可能发生。

Exception(例外)

Unique owner types that are move-only and cheap-to-move, such as unique_ptr, can also be passed by value which is simpler to write and achieves the same effect. Passing by value does generate one extra (cheap) move operation, but prefer simplicity and clarity first.

For example:

独占所有权类型只用于移动而且移动的成本很低,例如unique_ptr,可以使用容易编写且(和移动操作)效果相同的传值方式。传值确实会生成一个额外的(低成本的)移动操作,但是这里优先选择简单和清晰。

template <class T>
void sink(std::unique_ptr<T> p) {
    // use p ... possibly std::move(p) onward somewhere else
}   // p gets destroyed

Enforcement(实施建议)
  • Flag all X&& parameters (where X is not a template type parameter name) where the function body uses them without std::move. 提示所有函数体中没有对其使用std::move操作的X&&参数(这里X不是模板类型参数名)。
  • Flag access to moved-from objects. 提示对移动后对象的访问。
  • Don't conditionally move from objects 不要有条件对对象实施移动操作。

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

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

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

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • C++核心准则ES.56​:只在需要将一个对象显式移动到另外的作用域时使用std::move​

    We move, rather than copy, to avoid duplication and for improved performance.

    面向对象思考
  • C++核心准则C.64:移动操作在完成移动之后,移动源对象应该保持有效状态

    C.64: A move operation should move and leave its source in a valid state C.64:移动...

    面向对象思考
  • C++核心准则C.21:默认操作要定义就全定义,要禁止就全禁止

    The special member functions are the default constructor, copy constructor, copy...

    面向对象思考
  • 破解Charles

    大家在日常抓包,可能用的比较多的是burpsuite,对于我个人而言,我有时也会遇到这款工具,charles,下载地址是:https://www.charles...

    Jumbo
  • Flutter 构建完整应用手册-动画 顶

    作为UI开发人员,我们经常需要在屏幕上显示和隐藏元素。 但是,在屏幕上或屏幕外快速弹出元素会让最终用户感到不安。 相反,我们可以使用不透明动画淡入淡出元素,以创...

    南郭先生
  • 敖丙我写了一个新手都写不出的低级bug,被骂惨了。

    因为你们的丙丙啊,昨天有牌面了哟,直接被微信官方推荐,知乎推荐,也就仅仅是还行吧(心里乐开花)。

    敖丙
  • Pour Water

    思路: 模拟,每次drop一滴水,接着从左边开始找坑,坑的定义如下,存在j,使得a[j] < a[j + 1] && a[j - 1] > a[j] , 找...

    用户1147447
  • 纯生信m6A篇:内部套路大曝光

    无论医疗工作者还是研究生等等,如何在繁忙的工作生活中运用最短的时间,无需做实验发一篇SCI,一直是我们最头疼的问题!而纯生信文章就是作为SCI入门级别的不二选择...

    百味科研芝士
  • 记一次全民K歌的crash定位过程

    全民K歌4.6版本发布后,出现了一个与RecyclerView相关的Bug,作此记录。

    QQ音乐技术团队
  • 人脸检测--S3FD: Single Shot Scale-invariant Face Detector

    S3FD: Single Shot Scale-invariant Face Detector ICCV2017 Caffe code will be...

    用户1148525

扫码关注云+社区

领取腾讯云代金券