专栏首页C++核心准则原文翻译C++核心准则R.30: 只有在包含明确的生命周期语义时使用智能指针作参数

C++核心准则R.30: 只有在包含明确的生命周期语义时使用智能指针作参数

R.30: Take smart pointers as parameters only to explicitly express lifetime semantics

R.30: 只有在包含明确的生命周期语义时使用智能指针作参数

Reason(原因)

Accepting a smart pointer to a widget is wrong if the function just needs the widget itself. It should be able to accept any widget object, not just ones whose lifetimes are managed by a particular kind of smart pointer. A function that does not manipulate lifetime should take raw pointers or references instead.

如果一个函数只是需要一个部件本身,接受一个智能指针作参数是错误的。它应该可以接受所有部件对象,而不只是一个生命周期被按照特定方法管理的对象。不需要管理生命周期的函数应该使用原始的指针和引用。

Example, bad(反面示例)

// callee
void f(shared_ptr<widget>& w)
{
    // ...
    use(*w); // only use of w -- the lifetime is not used at all
    // ...
};

// caller
shared_ptr<widget> my_widget = /* ... */;
f(my_widget);

widget stack_widget;
f(stack_widget); // error
Example, good(范例)
// callee
void f(widget& w)
{
    // ...
    use(w);
    // ...
};

// caller
shared_ptr<widget> my_widget = /* ... */;
f(*my_widget);

widget stack_widget;
f(stack_widget); // ok -- now this works
Enforcement(实施建议)
  • (Simple) Warn if a function takes a parameter of a smart pointer type (that overloads operator-> or operator*) that is copyable but the function only calls any of: operator*, operator-> or get(). Suggest using a T* or T& instead.
  • (简单)如果一个函数使用了可拷贝的(重载了操作符->和操作符*的)智能指针类型的参数但是只是调用了运算符*、->或者get(),发出警告并建议使用T*或者T&。
  • Flag a parameter of a smart pointer type (a type that overloads operator-> or operator*) that is copyable/movable but never copied/moved from in the function body, and that is never modified, and that is not passed along to another function that could do so. That means the ownership semantics are not used. Suggest using a T* or T& instead.
  • 标记定义了(重载了操作符->和操作符*的)可拷贝/可移动智能指针类型的参数,但在函数体中却从未使用拷贝和移动功能,指针从未被修改也没有交给一个会那么做的函数的情况。那意味着所有权语义根本没有被使用。建议使用T*或者T&。

原文链接

https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#r30-take-smart-pointers-as-parameters-only-to-explicitly-express-lifetime-semantics


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

关注微信公众号【面向对象思考】轻松学习每一天!

面向对象开发,面向对象思考!

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

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

原始发表时间:2020-04-07

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • C++核心准则R.33: 表达函数会重置widget时,使用unique_ptr<widget>&​作参数

    R.33: 表达函数会重置widget时,使用unique_ptr<widget>&作参数。

    面向对象思考
  • 微信小程序的自定义组件(入门)

    我们知道,在我们设计微信小程序时,我们经常会用到开发者工具中提供的许多标签,例如:

    面向对象思考
  • C++核心准则R.32: 通过​unique_ptr<widget>类型参数表示函数试图获取widget的所有权

    R.32: 通过unique_ptr<widget>类型参数表示函数试图获取widget的所有权

    面向对象思考
  • sizeHint() minimumSizeHint() sizePolicy() 的使用

    http://blog.csdn.net/zzwdkxx/article/details/32116999

    bear_fish
  • Human Interface Guidelines — Widgets

    霖酱
  • TradingView配置

    用户1065635
  • Flutter跨平台移动端开发丨Widget、Element、State、状态管理

    widget 的主要工作是通过实现 build 函数 来构建自身。一个 widget 通常由一些低级别的 widget 组成,flutter 框架依次的构建这些...

    码脑
  • Qt开源作品16-通用无边框拖动拉伸

    相信各位CS结构开发的程序员,多多少少都遇到过需要美化界面的事情,一般都不会采用系统的标题栏,这样就需要无边框标题栏窗体,默认的话无边框的标题栏都不支持拉伸和拖...

    feiyangqingyun
  • Linux查看文本文件

    mwangblog
  • 为何cocos creator发布的facebook小游戏的载入进度条从0%飞向100%

    用cocos creator 发布 fb-instant-games (facebook小游戏 ) 后,发现平台预载入的进度条会从0等一段时间,然后直接飞到10...

    白玉无冰

扫码关注云+社区

领取腾讯云代金券