Ich verstehe, dass mit unique_ptr mit static_pointer_cast zu einem gemeinsamen Besitz der enthaltenen Daten führen würde.
Nur wenn Sie es schlecht definieren. Die offensichtliche Lösung wäre, dass das Eigentumsrecht übertragen wird, sodass das Quellobjekt leer ist.
Wenn Sie nicht das Eigentum übertragen wollen dann nur einen rohen Zeiger verwenden.
Oder wenn Sie zwei Besitzer wollen dann verwenden Sie shared_ptr
.
Es scheint, dass Ihre Frage nur teilweise über die eigentliche Cast-Operation, und teilweise nur das Fehlen einer klaren Besitz-Politik für den Zeiger. Wenn Sie mehrere Eigentümer benötigen, unabhängig davon, ob sie denselben Typ verwenden oder ob ein anderer Typ verwendet wird, sollten Sie unique_ptr
nicht verwenden.
Wie auch immer, das Ergebnis mit zwei unique_ptr, die nie gleichzeitig existieren sollte, so ist es einfach verboten.
Richtig, es macht Sinn, absolut, deshalb gibt es in der Tat nichts wie static_unique_pointer_cast.
Nein, das ist nicht der Grund, warum es nicht existiert. Es existiert nicht, weil es trivial ist, es selbst zu schreiben, wenn Sie es brauchen (und solange Sie es vernünftigen Semantiken des einzigartigen Eigentums geben). Holen Sie einfach den Zeiger mit release()
werfen Sie es, und legen Sie es in einem anderen unique_ptr
. Einfach und sicher.
Das ist nicht der Fall für die shared_ptr
ist, wo die „offensichtliche“ Lösung nicht das Richtige tut:
shared_ptr<Derived> p2(static_cast<Derived*>(p1.get());
, dass zwei verschiedene shared_ptr
Objekte erzeugen würde, die die gleichen Zeiger besitzen, aber don keine Eigentumsrechte teilen (dh sie würden beide versuchen, sie zu löschen, was zu undefiniertem Verhalten führt).
Wenn shared_ptr
zum ersten Mal genormt wurde, gab es keinen sicheren Weg dies zu tun, daher wurden static_pointer_cast
und die zugehörigen Casting-Funktionen definiert. Sie benötigten Zugriff auf die Implementierungsdetails der shared_ptr
Buchhaltungsinformationen, um zu arbeiten.
Doch während der C++ 11 Standardisierungsprozess shared_ptr
wurde durch die Zugabe des „Aliasing-Konstruktor“ erweitert, die Sie die Besetzung einfach und sicher tun können:
shared_ptr<Derived> p2(p1, static_cast<Derived*>(p1.get());
Wenn diese Funktion immer gewesen war Teil von shared_ptr
dann ist es möglicherweise, vielleicht sogar wahrscheinlich, dass static_pointer_cast
nie definiert worden wäre.
' static_pointer_cast' ist nur für ein Argument vom Typ 'std :: shared_ptr' definiert - es ist überhaupt nicht verwendbar mit 'unique_ptr' –
@MM Ja, ich weiß, ich habe fast das gleiche in der Frage geschrieben, dass es kein Äquivalent gibt für das 'unique_ptr'. – skypjack
Warum führt Typ-Löschung zu Downcasting? Wenn Sie Ihre Basisklasse in einen abgeleiteten Typ umwandeln müssen, ist es meistens, abgesehen von sehr wenigen Fällen, ein Designproblem, das anders gelöst werden sollte. – Jens