2012-06-12 18 views
6

Nach dem C++ 11 Standard ein Standard-Bewegung Konstruktor wird nur dann erzeugt, wenn:Explizit vorbelegt bewegt Konstruktor

  • X nicht über einen benutzer erklärte Copykonstruktor und
  • X hat keine Benutzer erklärt Kopie Zuweisungsoperator,
  • X keinen Benutzer deklarierte Bewegung Zuweisungsoperator hat,
  • X nicht ein benutzer erklärt destructor hat, und
  • der Umzug Konstruktor nicht implizit definiert werden würde wie gelöscht.

Kann ich es immer noch explizit voreinstellen? Scheint korrekt zu funktionieren. Wie dies zum Beispiel:

class MyClass { 
private: 
    std::vector<int> ints; 
public: 
    MyClass(MyClass const& other) : ints(other.ints) {} 
    MyClass(MyClass&& other) = default; 
}; 

Antwort

10

Die Motivation für diese Regel ist, dass, wenn die Standard Copykonstruktor nicht für Ihre Klasse nicht funktioniert, dann sind die Chancen der Standard bewegen Konstruktor sind nicht entweder (Regel von 5 arbeiten, oder was auch immer wir in C++ 11). Also ja, Sie können es explizit auf Ihre Ehre als Programmierer einstellen, dass es funktioniert.

In Ihrem Beispielcode könnten Sie stattdessen den Kopierkonstruktor entfernen, da er das Gleiche wie der Standard tut.

3

Ja, Sie können die Standardgenerierung für Funktionen, die automatisch mit = default generiert werden, immer explizit aufrufen. Dafür ist die Syntax gedacht.

Verwandte Themen