C++为什么"observer_ptr<W>"有一个采用"W*"的构造函数?

C++ why does `observer_ptr<W>` have a constructor taking `W*`?

本文关键字:构造函数 有一个 gt observer ptr lt C++ 为什么      更新时间:2023-10-16

据我了解,提议的std::observer_ptrstd::unique_ptr有关的方式与std::weak_ptrstd::shared_ptr有关的方式相同。

那么,根据提案 N4282,为什么std::observer_ptr<W>接口允许从W*指针进行构造呢?

这意味着一个包含W*作为成员的实现,可能类似于本答案中给出的伪实现,它最简单地提出了

template<typename T>
using observer_ptr = T*;

因此,这似乎排除了有效性检查,如下所示:

std::unique_ptr<W> u = std::make_unique<W>();
std::observer_ptr<W> o(uptr.get());
uptr.reset();
if(o)
{
     //u is already nullptr, but o doesn't know
     o->foo();  //invalid dereferentation
}

相反,我希望被允许执行以下操作:

std::unique_ptr<W> u = std::make_unique<W>();
std::observer_ptr<W> o(uptr);
uptr.reset();
if(o)
{
     //execution doesn't get here, o is nullptr
}

这相当于人们可以通过锁定std::weak_ptr来使用它来执行的操作,并且是 imo observer_ptr可以提供相对于非拥有原始指针的核心优势。

那么,再说一遍,为什么不强制执行呢?

据我了解,拟议的std::observer_ptrstd::unique_ptr有关的方式与std::weak_ptrstd::shared_ptr有关的方式相同。

这是一种误解。它与unique_ptr无关。它表示与被点头的所有权无关。