它可以实现正是如此:为什么不std :: weak_ptr有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的决定不具有操作符 - >?(他们一定想到了)
我可以想到潜在的原因,但我不知道官方原因是否存在。可能的原因是:
- 劝阻的引用计数额外递增/递减的多个呼叫
- 鼓励明确锁定,而不是(有些是隐藏的)异常
如果你感到困惑返回的shared_ptr的寿命,请参阅this paper.
另外,有人问为什么会使用weak_ptr,如果你预计它不会过期?答:循环。
但是据我所见,建议的'operator->'完全按照你的描述:转换为'shared_ptr',并且只允许在成功的情况下访问对象(否则抛出)。那是一件坏事? – 2015-01-15 18:39:53
@MikeSeymour:你想保持shared_ptr并调用它的方法,而不必支付同步成本。 – 2015-01-15 18:42:27
@AlexandreC .:有时你会这样做,在这种情况下手动转换仍然可用。有时您只想访问单个成员,在这种情况下,手动转换只是噪音,建议的操作员可以使其更加整洁。 – 2015-01-15 18:44:09