unique_ptr operator=
std::unique_ptr<int> ptr;
ptr = new int[3]; //error
error C2679: binärer '=' : kein operator gefunden, die einen rechten Operanden vom Typ 'int *' (oder es gibt keine akzeptable Konvertierung)
Warum dies nicht kompiliert? Wie kann ich die befestigen nativen Zeiger auf vorhandene unique_ptr Instanz?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Erstens, wenn Sie eine einzigartige Palette, stellen Sie es
Dies ermöglicht es der smart-Zeiger korrekt zu verwenden
delete[]
freigeben der pointer, und definiert dieoperator[]
zu imitieren, um ein normales array.Dann, die
operator=
ist nur definiert für rvalue-Referenzen der einzigartige Zeiger-und nicht-raw-Zeiger und ein raw-pointer nicht implizit konvertiert werden können, um ein smart-pointer, um zu vermeiden, zufälligen Zuordnung, bricht Einzigartigkeit. Also ein raw-pointer können nicht direkt zugewiesen werden. Der richtige Ansatz ist es, um den Konstruktor:oder verwenden Sie den
.reset
Funktion:oder explizit konvertieren der raw-pointer auf einen eindeutigen Zeiger:
Wenn Sie können, verwenden Sie C++14, bevorzugen die
make_unique
- Funktion über die Verwendungnew
an alle:operator=
nicht akzeptierenint*
und der Konstruktor der Einnahmeint*
gekennzeichnet istexplicit
(für beidestd::unique_ptr<int>
undstd::unique_ptr<int[]>
).operator=
wird ein move-Zuweisungs-operator und nicht eine Kopie Zuweisungsoperator hat nichts zu tun mit es jedoch.Hinzufügen, um die Antwort aus
KennyTM
(seit C++11)
Ich persönlich bevorzuge dieses, da es macht die Aktualisierung des Typ tr einfacher. (Nur mit einer Stelle zu aktualisieren)