Es könnte thusly realisiert werden:Warum hat std :: weak_ptr nicht operator->?
std::shared_ptr<T> operator->() {
auto shared = lock();
if(shared == nullptr) {
throw std::bad_weak_ptr(); // or some other exception
}
return shared;
}
Warum haben die Autoren von weak_ptr entscheiden nicht operator- haben>? (Sie müssen daran gedacht haben)
Ich kann mir mögliche Gründe vorstellen, aber ich frage mich, was der offizielle Grund ist, wenn einer existiert. Mögliche Ursachen:
- Entmutigen zusätzliche Erhöhung/Verminderung der Referenzzähler für mehrere Anrufe
- explizite Sperren fördern, anstatt (etwas versteckt) Ausnahmen
Wenn Sie sind verwirrt über die gesamte Lebensdauer des zurück Shared_ptr Siehe this paper.
Auch fragte jemand, warum sollte man einen weak_ptr verwenden, wenn Sie erwarten, dass es nicht abgelaufen ist? Antwort: Zyklen.
Aber so weit ich sehe, macht der vorgeschlagene 'operator->' genau das, was du beschreibst: konvertiere zu 'shared_ptr' und erlaube nur den Zugriff auf das Objekt, wenn das gelingt (andernfalls). Wie ist das eine schlechte Sache? –
@MikeSeymour: Sie möchten die shared_ptr behalten und Methoden aufrufen, ohne die Synchronisationskosten zu bezahlen. –
@AlexandreC .: Manchmal tun Sie, in diesem Fall ist manuelle Konvertierung noch verfügbar. Manchmal möchten Sie nur auf ein einzelnes Mitglied zugreifen. In diesem Fall ist die manuelle Konvertierung nur ein Rauschen, das der vorgeschlagene Operator verbessern kann. –