c++ - 为什么 std::weak_ptr 没有 operator->?

标签 c++ shared-ptr smart-pointers weak-ptr

可以这样实现:

  std::shared_ptr<T> operator->() {
      auto shared = lock();
      if(shared == nullptr) {
          throw std::bad_weak_ptr(); // or some other exception
      }
      return shared;
  }

Live Demo

为什么 weak_ptr 的作者决定不用 operator->?(他们一定想到了)

我能想到潜在的原因,但我想知道官方原因 是什么,如果存在的话。潜在原因:

  • 不鼓励为多次调用增加/减少引用计数
  • 鼓励显式锁定而不是(有些隐藏的)异常

如果您对返回的 shared_ptr 的生命周期感到困惑,请参阅 this paper.

另外,有人问如果你希望它不会过期,为什么要使用 weak_ptr?答:周期。

最佳答案

original proposal weak_ptr 不包括 operator-> 的重载。

从那以后我就没有仔细阅读过每次 session 的记录,但一直在关注所讨论的内容,并且不记得有任何人提议添加它。因此,它不存在的“官方”原因可能主要是没有人建议添加它。

如果你想回到非常的开始,大部分内容来自 John Ellis 和 David Detlef 的 Safe, Efficient Garbage Collection for C++论文,来自 Usenix 1994。它在附录 B 中包含一个 weakptr 类型。这有点不同(weakptr::pointer 直接返回一个指针,如果pointee 已经被销毁),但仍然没有使用运算符重载来完成这项工作。

Greg Colvin 撰写了 original proposal to add counted_ptr到标准。它的 counted_ptr 本质上等同于现在所谓的 shared_ptr,但不包含任何类似于 weak_ptr 的内容。

在委员会拒绝了 counted_ptr 提案并采用了 auto_ptr 之后不久,counted_ptr 的基本思想在 Boost 上重新出现。我不记得看到过任何关于向其添加 operator-> 的讨论,但它“存在”了很长时间,以至于完全有可能有人在我不知情的情况下提出了它。

关于c++ - 为什么 std::weak_ptr 没有 operator->?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27970400/

相关文章:

c++ - 如何获取 com_ptr_t 中指针的地址

c++ - move 构造函数的这种实现会丢弃 move 语义吗?

c++ - 写入 ofstream 然后用 ifstream 读取不会读取整个文件

c++ - 如何从在另一个函数中调用的函数结束程序 (C++)

c++ - 将 void * 转换为类型的shared_ptr

c++ - 是否可以进行只读复制(通过引用)shared_ptr?

c++ - 无法返回 unique_ptr

c++ - 您可以将指针传递给 std::vector 的迭代器吗

C++编译错误: no matching constructor for initialization

rust - 在 actix-web 服务器和异步闭包之间共享状态