2013-03-18 5 views
21

Ich habe den Code folgendedestructor und unique_ptr

class A { 
    public: 
     A(){} 
     ~A(){} 
    private: 
     std::vector<std::unique_ptr<double> > x; 
}; 

A f() { 
    A a; 
    return a; 
} 

int main() { 
    A a=f(); 
    return 0; 
} 

Es lässt sich nicht kompilieren (gcc 4.7), es sei denn ich die destructor Kommentar aus. Eigentlich brauche ich diesen Destruktor nicht wirklich in meinem Code, ich wollte ihn nur zum Debuggen verwenden.

Allerdings verstehe ich nicht was passiert und ich fürchte daher, dass ich etwas falsch gemacht habe. Was passiert hier ?

+4

Bei der Frage, warum etwas nicht kompiliert wird, ist es immer hilfreich, die Fehlermeldung hinzuzufügen. – NPE

+0

@ user2183861 nein, es wird dort nicht beantwortet. Die Frage ganz anders –

Antwort

26

Das liegt daran, dass das Vorhandensein eines explizit definierten Destruktors die implizite Generierung eines Verschiebungskonstruktors für A verhindert.

Per Ziffer 12.8/9 des C++ 11 Standard:

Wenn die Definition einer Klasse X nicht explizit einen Zug Konstruktor deklariert, wird man implizit deklariert werden als ausgefallen, wenn und nur wenn

- X hat kein benutzer erklärt Copykonstruktor,

- X nicht ein benutzer erklärt Kopie Zuweisungsoperator hat,

X nicht über eine benutzer erklärt Bewegung Zuweisungsoperator,

- X nicht ein benutzer erklärt hat destructor und

- der Umzug Konstruktor nicht implizit als gelöscht definiert werden würde.

nun ohne Bewegung Konstruktor, den Wert zurückzukehren, von f() der Compiler die implizit erzeugten Copykonstruktor aufrufen wird versuchen (die nach wie vor für die Abwärtskompatibilität erzeugt wird). std::unique_ptr ist jedoch nicht kopierbar. Daher der Fehler.

Das explizite Definieren eines Verschiebungskonstruktors (oder das Deklarieren eines Standardwerts, wie von juanchopanza in den Kommentaren vorgeschlagen) wird das Problem beheben.

+8

+1, Hinzufügen von 'A (A &&) = default;' würde es kompilieren. – juanchopanza

+0

@juanchopanza: Ja, richtig –

+0

Ok danke, das löst es;) –