unique_ptr<T>
erlaubt nicht die Konstruktion von Kopien, sondern unterstützt die Semantik des Verschiebens. Dennoch kann ich eine unique_ptr<T>
aus einer Funktion und weisen den zurückgegebenen Wert einer Variablen zu.
#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 lässt sich kompilieren und funktioniert wie vorgesehen. Wie kommt es also, dass die Zeile 1
den Kopierkonstruktor nicht aufruft und zu Compilerfehlern führt? Wenn ich die Zeile verwenden müsste 2
stattdessen wäre es sinnvoll (mit Zeile 2
funktioniert auch, aber wir sind nicht dazu verpflichtet, dies zu tun).
Ich weiß, dass C++0x diese Ausnahme erlaubt, um 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 gewährleistet wird. Ich bin neugierig, wie dies implementiert ist. Ist es ein Sonderfall im Compiler oder gibt es eine andere Klausel in der Sprachspezifikation, die dies ausnutzt?