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 1
den 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 2
funktioniert auch, aber wir müssen dies nicht tun).
Ich weiß, dass C ++ 0x diese Ausnahme zulässt, unique_ptr
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 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.
main
Funktion beendet wurde, jedoch nicht, wenn die Funktion beendet wird foo
.