unique_ptr<T>
erlaubt keine Kopierkonstruktion, stattdessen unterstützt sie die Bewegungssemantik. Dennoch kann ich eine unique_ptr<T>
von einer Funktion zurückgeben und den zurückgegebenen Wert einer Variablen zuweisen.unique_ptr aus Funktionen zurückgeben
#include <iostream>
#include <memory>
using namespace std;
unique_ptr<int> foo()
{
unique_ptr<int> p(new int(10));
return p; // 1
//return move(p); // 2
}
int main()
{
unique_ptr<int> p = foo();
cout << *p << endl;
return 0;
}
Der obige Code kompiliert und funktioniert wie vorgesehen. Also, wie kommt es, dass die Zeile 1
den Kopierkonstruktor nicht aufruft und Compilerfehler verursacht? Wenn ich stattdessen die Zeile 2
verwenden müsste, wäre das sinnvoll (die Verwendung der Zeile 2
funktioniert ebenfalls, aber wir müssen das nicht tun).
Ich weiß, dass C++ 0x diese Ausnahme zu unique_ptr
zulässt, da der Rückgabewert ein temporäres Objekt ist, das zerstört wird, sobald die Funktion beendet wird, wodurch die Eindeutigkeit des zurückgegebenen Zeigers garantiert wird. Ich bin neugierig, wie das implementiert wird, ist es speziell im Compiler oder gibt es eine andere Klausel in der Sprachspezifikation, die dieses ausnutzt?
Wenn Sie eine * factory * -Methode implementieren würden, würden Sie am ehesten 1 oder 2 bevorzugen, um die Werksausgabe zurückzugeben? Ich nehme an, dass dies die gebräuchlichste Verwendung von 1 wäre, weil Sie bei einer richtigen Fabrik tatsächlich möchten, dass das Eigentum des konstruierten Objekts an den Anrufer weitergegeben wird. – Xharlie
@ Xharlie? Sie beide übergeben den Besitz des 'unique_ptr'.Die ganze Frage ist, dass 1 und 2 zwei verschiedene Wege sind, um dasselbe zu erreichen. – Praetorian