C++ C++;为什么“观察者”\u ptr<;W>;`是否有一个构造函数使用'W*`?

C++ C++;为什么“观察者”\u ptr<;W>;`是否有一个构造函数使用'W*`?,c++,smart-pointers,c++17,C++,Smart Pointers,C++17,据我所知,提议的std::observer_ptr与std::unique_ptr相关,就像std::弱_ptr与std::shared_ptr相关一样 那么,根据提案,为什么std::observer\u ptr接口允许从W*指针进行构造 这意味着一个包含W*作为成员的实现,可能类似于中给出的伪实现,后者最简单地建议 template<typename T> using observer_ptr = T*; 模板 使用观察者_ptr=T*; 因此,这似乎排除了以下有效性检查:

据我所知,提议的
std::observer_ptr
std::unique_ptr
相关,就像
std::弱_ptr
std::shared_ptr
相关一样

那么,根据提案,为什么
std::observer\u ptr
接口允许从
W*
指针进行构造

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

template<typename T>
using observer_ptr = T*;
模板
使用观察者_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::unique_ptr u=std::make_unique();
std::observer_ptr o(uptr.get());
uptr.reset();
如果(o)
{
//u已经是空PTR,但o不知道
o->foo();//引用无效
}
相反,我只希望被允许做以下事情:

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::unique_ptr u=std::make_unique();
标准:观察者(uptr);
uptr.reset();
如果(o)
{
//执行不能到达这里,o是null ptr
}
这相当于通过锁定
std::weak_ptr
可以实现的功能,并且是
observer_ptr
相对于非自有原始指针的核心优势

那么,为什么不强制执行呢

据我所知,拟议的
std::observer_ptr
std::unique_ptr
相关,正如
std::弱_ptr
std::shared_ptr
相关一样


这是一种误解。它与
唯一性\u ptr
无关。它表示与指针对象的所有权没有联系。

您从何处想到可以检查这样一个指针是否有效?@molbdnilo:如所写,来自
std::weak\u ptr
并行。在我看来,这是很自然的,也可以看到,这似乎做出了同样的假设。答案是“对删除该对象的正确响应,[…]不承担任何责任”,相反,你会让它做什么?存储一个
唯一的\u ptr*
?这太没用了。假设
observer\u ptr
存储一个
唯一的\u ptr*
<代码>标准::观察员_ptro;{std::unique_ptr u=std::make_unique();o=uptr;}。在此之后,如何检查
o
的有效性?你不能。同时,您还使
observer\u ptr
不能用于堆栈对象。这也是一个简化,因为
unique\u ptr
是在deleter上模板化的,所以你的
observer\u ptr
必须如此模板化或删除类型。谢谢你的回答,那么
std::weak\u ptr
并行的
std::unique\u ptr
?@davidhigh-没有了。由于
unique\u ptr
应该拥有指针或包含空ptr,所以没有太多需要检查的地方。@Bo Persson:好的,谢谢,我知道了。但它与
弱\u ptr
不一致。也是无用的:C++保护墨菲,而不是马基雅维利。隐藏
delete
的类没有任何优势。然而,类中至少有一个与
弱\u ptr
并行的类,请看我的问题。@davidhigh的重点不是隐藏
删除
,而是标记你有一个指针,你只是要用它来观察指针对象,一旦它对你不再有用,就不要在免费商店的圣坛上献祭。@TartanLlama:我明白。但必须有人拥有初始实例<代码>弱\u ptr
知道这个人是谁
observer\u ptr
没有(这在语义上可能对某些人有用)。但必须有第三个概念,表达“只有一个所有者,我知道它”。它缺乏智能指针的概念。