可以这样实现:
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,如果您希望它不过期?答案:循环引用。
operator->
正好符合您所描述的:将其转换为shared_ptr
,并仅在成功访问对象时允许访问(否则会抛出异常)。这有什么不好的呢? - Mike Seymourweak_ptr
的最早版本我能轻易找到的是2003年2月10日。这里也没有operator->
。版权声明包括“版权所有1999年Greg Colvin和Beman Dawes,版权所有2002年Darin Adler,版权所有2002年、2003年Peter Dimov”,这与您链接的原始提案的作者相吻合。在此处有一些旧文档的片段,1999年提到了智能指针。版本1.20可能会有所启发? - Yakk - Adam Nevraumontstd::shared_ptr
来自于Boost(提案的作者和论文本身)。 - Yakk - Adam Nevraumont