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

时间:2016-01-21 10:53:00

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

据我所知,建议的std::observer_ptrstd::unique_ptr的关联方式与std::weak_ptrstd::shared_ptr相关的方式相同。

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

这意味着一个包含W*成员的实现,可能类似于this answer中给出的伪实现,最简单的建议

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执行的操作,并且是observer_ptr可以为非拥有的原始指针提供的核心优势。

那么,再说一遍,为什么它没有被强制执行?

1 个答案:

答案 0 :(得分:9)

  

据我所知,建议的std::observer_ptrstd::unique_ptr的关联方式与std::weak_ptrstd::shared_ptr相关的方式相同。

这是一种误解。它与unique_ptr无关。它表示与指针对象的所有权没有关系。