501 Stimmen

Rückgabe von unique_ptr aus Funktionen

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?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X