它可以實現正是如此:爲什麼不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