unique_ptr<T>erlaubt keine Kopierkonstruktion, sondern unterstützt die Verschiebungssemantik. Dennoch kann ich a zurückgebenunique_ptr<T> von einer Funktion zurückgeben und den zurückgegebenen Wert einer Variablen zuweisen.
#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 wird kompiliert und funktioniert wie vorgesehen. Wie kommt es also, dass die Zeile 1den Kopierkonstruktor nicht aufruft und zu Compilerfehlern führt? Wenn ich Linie benutzen müsste2 stattdessen verwenden müsste, wäre dies sinnvoll (die Verwendung von Leitung 2funktioniert auch, aber wir müssen dies nicht tun).
Ich weiß, dass C ++ 0x diese Ausnahme zulässt, unique_ptrda 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 gespannt, wie dies implementiert wird. Ist es speziell im Compiler enthalten oder gibt es eine andere Klausel in der Sprachspezifikation, die dies ausnutzt?
unique_ptr. Die ganze Frage ist, dass 1 und 2 zwei verschiedene Wege sind, um dasselbe zu erreichen.
mainFunktion beendet wurde, jedoch nicht, wenn die Funktion beendet wird foo.