【问题标题】:Practical code-friendly name for non-owning smart-pointer [closed]非拥有智能指针的实用代码友好名称[关闭]
【发布时间】:2017-07-04 10:28:12
【问题描述】:

自 C++11 以来,我们拥有一组相当完整的智能指针类型:

  • std::shared_ptr
  • std::weak_ptr
  • std::unique_ptr
  • std::auto_ptr(已弃用)

但缺少的是没有所有权的智能指针,与上述集成。

这似乎将开发人员的讨论引向了一个有点松散的分类,通常包含诸如“这是一个非拥有的智能指针”之类的短语。但这不是我想在代码中命名指针包装模板时使用的好名称。

对于非拥有的智能指针有更好的代码友好名称的建议吗?

template<typename T>
struct NonOwningSmart_pointer;

有 std::weak_ptr 并没有真正满足要求,因为它需要 shared_ptr。

更新:唯一命名这种类型的智能指针的主要好处是代码清晰、构造为 nullptr 以及与其他 std 指针类型配合得很好。

【问题讨论】:

  • 弱指针与“NonOwningSmart_pointer”有何不同?
  • 据我了解,std::weak_ptr 始终与 std::shared_ptr 相关联。但是有 std::unique_ptr 和 raw。
  • 为什么首先需要非拥有智能指针?比普通指针有什么好处?
  • 好吧,如果您遵循 cpp 核心指南,那么原始指针始终是非拥有指针。只有 owner 或智能指针被视为所有者。如果您使用这种方法,这种方式会让生活变得轻松,因为您只是假设所有原始指针都不是您要管理的。我个人喜欢这种方法。
  • 可能会感兴趣/修改“Herb Sutter - 区分可能为空和永不为空是重要的事情”herbsutter.com/2017/02/15/…

标签: c++ pointers stl


【解决方案1】:

C++ 核心指南似乎建议对非拥有指针使用原始指针。我想,从技术上讲,他们说使用智能指针来指示所有权并假设原始指针是非拥有的。我想这并不排除将智能指针用于非拥有指针,但我看不出它会提供什么优势。

【讨论】:

  • 优点是您看到指针并立即知道它是非拥有的。如果只是T*,那么您必须检查代码或文档才能找到。
  • 此外,并非所有原始指针都与对象生命周期和所有权有关。我总是使用某种类型来明确指针的作用。
  • @ChristianHackl:如果您遵循核心准则,则不会。如果您看到T*,那么您确实知道它是一个非拥有指针。
  • @AdrianMcCarthy:你可能在一个庞大的项目中工作,有许多不同的开发人员,编码风格不一致,新代码和旧代码混合在一起。
  • @"Adrian McCarthy":带有大量原始指针的遗留代码是现实,我不明白为什么这是在假定更好的方法?
【解决方案2】:

甚至有这样的提议: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4282.pdf

在那里它被命名为“observer_ptr”。
该提案被拒绝,但最近在 Boost 邮件列表上讨论了相同的想法(并获得了更积极的反馈)。

【讨论】:

  • 所有者和观察者,这个中间地带很弱。是的,我想我喜欢它,目前为止最好的。
  • "N4282: A Proposal for the World's Dumbest Smart Pointer, v4" - 这个标题让我很开心 ;)
猜你喜欢
  • 1970-01-01
  • 2017-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-07
  • 1970-01-01
  • 2012-02-02
  • 1970-01-01
相关资源
最近更新 更多