“世界上最愚蠢的智能指针是什么意思?”

时间:2016-04-27 17:51:47

标签: c++ smart-pointers c++17

提案N4282提倡一种名为observer_ptr的新型非拥有智能指针。它的工作名称是exempt_ptr,它的目的是取代“原始指针”。但我不明白它的目的,尤其是这个假设的代码是为了实现它的目的:

struct do_nothing
{
  template <class T>
  void operator ()(T*) { }; // do nothing
};

template <class T>
  using non_owning_ptr = unique_ptr<T, do_nothing>;

即使阅读了这篇文章,我也不明白智能指针的目的是什么都不做。它比非拥有shared_ptr或原始指针有什么优势?

1 个答案:

答案 0 :(得分:8)

您是否阅读过proposal N4282所链接的“动机”部分?

  

对于程序员来说,检查代码以识别任何特定裸指针所使用的用途经常被证明是非常具有挑战性和耗时的,即使该用户根本没有管理角色。正如LoïcA。Joly观察到的那样,“消除仅仅观察数据的T *指针是不容易的......即使它只是用于文档,但我认为拥有专用类型会有一些价值。”经验使我们同意这一评估。

换句话说,就是让代码更加自我记录。

例如,如果我看到以下功能:

void do_something(Foo *foo);

然后我不知道do_something是否拥有foo的所有权,想要一个不确定长度的Foo数组,只需要一个可以为空的引用,将它用作Google C++ Style Guide样式的输出参数,或者是遗留的只需要参考的C风格代码。

但是,如果我看到

void do_something(observer_ptr<Foo> foo);

然后我知道它正在观察一个Foo实例,而不是更多。

C++ Core Guidelines有几个使用模板的示例(ownernot_null等),不是为了添加运行时功能,而是为了更好地记录行为。