2016-01-21 59 views
0

据我所知,拟议的std::observer_ptrstd::unique_ptr有关,与std::weak_ptrstd::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可以通过非拥有的原始指针提供的核心优势。

那么,为什么它不被强制执行呢?

+0

你从哪里知道你可以检查这样的指针是否有效? – molbdnilo

+0

@molbdnilo:写成,来自'std :: weak_ptr'并行。这只会是自然的imo,另请参见[这个答案](http://stackoverflow.com/a/17561445/2412846)似乎做出了相同的假设。 – davidhigh

+0

答案是“对于正确回应删除该对象不负任何责任”,相反的说。 – molbdnilo

回答

9

据我理解提出std::observer_ptr作为std::weak_ptr有关std::shared_ptr以同样的方式与std::unique_ptr

这是一种误解。它与unique_ptr没有关系。它表示与指责者的所有权没有关系。

+0

感谢您的回答,那么,在那里是'std :: weak_ptr'并行的'std :: unique_ptr'? – davidhigh

+1

@davidhigh - 没有任何。由于'unique_ptr'应该拥有指针或者包含nullptr,所以没有太多需要检查的地方。 –

+0

@波佩尔森:好的,谢谢,我明白了。但是'weak_ptr'不一致。也没用:C++防止墨菲,而不是马基雅维利。隐藏'delete'的类没有优势。然而,在一个类中有(至少很小的)类似'weak_ptr',看我的问题。 – davidhigh

相关问题