据我所知,拟议的std::observer_ptr
与std::unique_ptr
有关,与std::weak_ptr
与std::shared_ptr
有关。C++为什么`observer_ptr <W>`有一个带`W *`的构造函数?
那么为什么std::observer_ptr<W>
接口,根据建议N4282,允许从W*
指针建设吗?
这意味着其中包含一个W*
作为成员的实现,也许类似于this answer给出的伪实现,其中最简单的建议
template<typename T>
using observer_ptr = T*;
因此,这似乎outrule有效性检查作为以下:
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
可以通过非拥有的原始指针提供的核心优势。
那么,为什么它不被强制执行呢?
你从哪里知道你可以检查这样的指针是否有效? – molbdnilo
@molbdnilo:写成,来自'std :: weak_ptr'并行。这只会是自然的imo,另请参见[这个答案](http://stackoverflow.com/a/17561445/2412846)似乎做出了相同的假设。 – davidhigh
答案是“对于正确回应删除该对象不负任何责任”,相反的说。 – molbdnilo