據我所知,擬議的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