可以这样实现:
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 的生命周期感到困惑,请参阅 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/