"The World's Dumbest Smart Pointer?"有什么意义

What's the point of "The World's Dumbest Smart Pointer?"

本文关键字:Pointer 什么 Smart Dumbest World The      更新时间:2023-10-16

>提案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或原始指针相比,它有什么优势?

您是否阅读了您链接的提案 N4282 中的"动机"部分?

对于程序员来说,检查代码以识别任何特定裸指针的用途通常非常具有挑战性和耗时,即使该用途根本没有管理角色。正如Loïc A. 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++核心指南有几个使用模板的附加示例(ownernot_null等),不是为了添加运行时功能,而是为了更好的文档行为。