簡體   English   中英

為什么std :: weak_ptr沒有operator->?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM