Mit dem neuen Standard (und Teilen, die bereits in einigen Compilern verfügbar sind) soll der neue Typ std::unique_ptr
ein Ersatz für sein std::auto_ptr
.
Überlappt sich ihre Verwendung genau (damit ich meinen Code global suchen / ersetzen kann (nicht, dass ich dies tun würde, aber wenn ich es tun würde)) oder sollte ich mir einiger Unterschiede bewusst sein, die beim Lesen der Dokumentation nicht erkennbar sind?
Auch wenn es sich um einen direkten Ersatz handelt, warum sollte man ihm einen neuen Namen geben, anstatt nur den zu verbessern std::auto_ptr
?
quelle
std::auto_ptr
undstd::unique_ptr
sind in einigen Fällen inkompatibel und in anderen ein Rückgang des Ersatzes. Kein Suchen / Ersetzen ist also nicht gut genug. Nach einem Suchen / Ersetzen sollten die Kompilierungsfehler jedoch alles außer seltsamen Eckfällen beheben. Für die meisten Kompilierungsfehler muss a hinzugefügt werdenstd::move
.100% kompatibel, solange Sie sie nicht als Wert an eine andere Funktion übergeben.
nicht 100% kompatibel, aber 99% kompatibel scheint nicht falsch zu sein.
100% kompatibel mit einer Einschränkung,
unique_ptr
s muss durch einenstd::move
Aufruf geleitet werden. Dieser ist einfach, da sich der Compiler beschwert, wenn Sie es nicht richtig machen.100% kompatibel.
Diese ist schwierig.
std::auto_ptr
s Kopiersemantik ist böse. Wenn die Klasse das Kopieren nicht zulässt,std::unique_ptr
wird die Ersetzung verringert. Wenn Sie jedoch versucht haben, der Klasse eine angemessene Kopiersemantik zu geben, müssen Sie denstd::auto_ptr
Behandlungscode ändern . Dies ist einfach, da sich der Compiler beschwert, wenn Sie es nicht richtig machen. Wenn Sie das Kopieren einer Klasse mit einemstd::auto_ptr
Mitglied ohne speziellen Code erlaubt haben , dann schämen Sie sich und viel Glück.Zusammenfassend
std::unique_ptr
ist eine ungebrochenestd::auto_ptr
. Zum Zeitpunkt der Kompilierung sind Verhaltensweisen nicht zulässig, bei denen bei der Verwendung von a häufig Fehler aufgetreten sindstd::auto_ptr
. Wenn Sie alsostd::auto_ptr
mit der nötigen Sorgfalt vorgehen, sollte der Wechselstd::unique_ptr
zu einfach sein. Wenn Sie sich aufstd::auto_ptr
das seltsame Verhalten verlassen haben, müssen Sie Ihren Code trotzdem umgestalten.quelle
SO VIEL ICH WEISS,
unique_ptr
ist kein direkter Ersatz. Der Hauptfehler, den es behebt, ist die implizite Übertragung des Eigentums.Auf der anderen Seite
unique_ptr
werden völlig neue Funktionen haben: Sie können in Containern gelagert werden.quelle
auto_ptr
nicht zulässig sind.Herb Sutter hat eine nette Erklärung zu GotW # 89 :
Mit anderen Worten, während ein globales Suchen und Ersetzen Ihren Code vorübergehend "beschädigen" kann, sollten Sie es trotzdem tun: Es kann einige Zeit dauern, bis die Kompilierungsfehler behoben sind, aber Sie sparen auf lange Sicht viel mehr Ärger.
quelle