C++ 为什么 `observer_ptr<W>` 有一个采用 `W*` 的构造函数?
C++ why does `observer_ptr<W>` have a constructor taking `W*`?
据我了解,提议的 std::observer_ptr
与 std::unique_ptr
的关联方式与 std::weak_ptr
与 std::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
通过锁定它可以做的事情,并且是 imo observer_ptr
可以提供非拥有原始指针的核心优势。
那么,为什么不强制执行呢?
As far I understood the proposed std::observer_ptr
is related to std::unique_ptr
in the same way as std::weak_ptr
is related to std::shared_ptr
.
这是一种误解。它与 unique_ptr
无关。表示与指针对象的所有权无关。
据我了解,提议的 std::observer_ptr
与 std::unique_ptr
的关联方式与 std::weak_ptr
与 std::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
通过锁定它可以做的事情,并且是 imo observer_ptr
可以提供非拥有原始指针的核心优势。
那么,为什么不强制执行呢?
As far I understood the proposed
std::observer_ptr
is related tostd::unique_ptr
in the same way asstd::weak_ptr
is related tostd::shared_ptr
.
这是一种误解。它与 unique_ptr
无关。表示与指针对象的所有权无关。