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

use*_*916 6 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>;
Run Code Online (Sandbox Code Playgroud)

即使在阅读完文章之后,我也不明白智能指针的目的是什么都不做.它比非拥有shared_ptr或原始指针有什么优势?

Jos*_*ley 7

您是否阅读过您提供的N4282提案中的"动机"部分?

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

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

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

void do_something(Foo *foo);
Run Code Online (Sandbox Code Playgroud)

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

但是,如果我明白了

void do_something(observer_ptr<Foo> foo);
Run Code Online (Sandbox Code Playgroud)

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

C++核心准则有一些额外的例子(owner,not_null,等)使用模板的,不添加运行时功能,但求更好的文档的行为.