2016-01-21 55 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

相關問題