[英]Why doesn't std::weak_ptr have operator->?
它可以這樣實現:
std::shared_ptr<T> operator->() {
auto shared = lock();
if(shared == nullptr) {
throw std::bad_weak_ptr(); // or some other exception
}
return shared;
}
為什么weak_ptr的作者決定不使用operator->? (他們一定想到了)
我可以想到潛在的原因,但我想知道官方的原因是什么,如果存在的話。 可能的原因:
如果您對返回的shared_ptr的生命周期感到困惑,請參閱此文章。
另外,有人問為什么如果你期望它沒有過期,會使用weak_ptr? 答案:周期。
最初的提議 weak_ptr
沒有包含operator->
的重載。
我沒有仔細查看過每次會議的會議記錄,但是已經按照所討論的內容進行了討論,並且不記得有人提到應該添加它。 因此,它不存在的“官方”原因很可能是沒有人建議添加它。
如果你想回到最開始,這個最源於約翰·埃利斯和大衛德特勒夫的安全,高效的垃圾收集C ++紙,從Usenix的1994年,其中包括一個weakptr
在其附錄B型這是有些不同( weakptr::pointer
直接返回一個指針,如果指針對象已經被銷毀,則返回一個空指針),但仍然沒有使用運算符重載來完成這項工作。
counted_ptr
文寫了最初的提議,將counted_ptr
添加到標准中。 它的counted_ptr
基本上等同於現在稱為shared_ptr
東西,但沒有包含類似於weak_ptr
東西。
不久后,委員會拒絕了counted_ptr
建議,並接受auto_ptr
替代,基本思路counted_ptr
復興的推動作用。 我不記得看過任何關於添加一個operator->
討論,但是它“存活”了很長時間以至於完全有可能有人在沒有意識到它的情況下提出它。
我會盡力說明為什么這不是一個好主意:
一件事是清晰度:
ptr->foo();
ptr->bar();
這里的問題是在第一次和第二次調用之間的某個地方,ptr可能會通過一個不同的線程(這將是一個競爭條件)或者對foo
的調用的副作用到期。
另一件事是對稱性:當我有一個指針時,我期望運算符*
, ->
和一個隱式轉換為布爾值。 有些人可能不同意,但運營商*
和->
經常重合。 我很驚訝這不是這種情況。
也就是說,使用C ++ 11,它很容易編寫:
if (auto p = ptr.lock()) {
p->foo();
p->bar();
}
知道ptr
是一個weak_ptr
,該代碼的含義和行為非常清楚。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.