2013-03-23 14 views
26

Das soll eine triviale Frage sein, aber ich konnte sie nicht explizit auf Stackoverflow finden.Bedingungen, unter denen der Compiler keine implicits definiert (Konstruktor, Destruktor, Kopierkonstruktor, Kopierzuweisung)

Folgendes wird implizit definiert, wenn es nicht vom Benutzer bereitgestellt wird.

  1. default (parameter) Konstruktor
  2. Copykonstruktor
  3. Kopie Zuweisungsoperator
  4. destructor

Aber ich habe irgendwo (ich kann nicht scheinen zu finden, jetzt), dass es zu lesen sind einige Bedingungen, unter denen der Compiler sie nicht implizit implementiert.

Was sind diese Bedingungen?

Antwort

44

The Default Constuctor (zB X()) nicht implizit, wenn generiert werden:

  • Sie explizit haben erklärt jeder Konstruktor an allen
  • gibt es ein Datenelement, das nicht-konstruierbar Standard (wie eine Referenz, ein const Objekt oder eine Klasse mit keinem oder nicht zugreifbarem Standardkonstruktor)
  • (C++ 11) Sie haben dem Compiler explizit gesagt, dass er X() = delete;
  • nicht erzeugen soll

    • Sie erklärt ein Copykonstruktor (für Klasse X ein Konstruktor unter X, X& oder const X&)
    • haben dort explizit:

    The Copy Constructor (zB X(const X&)) nicht implizit, wenn erzeugt werden ist ein Datenelement, das nicht kopierkonstruierbar ist (z. B. eine Klasse mit keinem oder einem nicht zugänglichen Kopierkonstruktor)

  • die Basisklasse nicht copy-konstruierbar
  • (C++ 11) Sie haben eine Bewegung Konstruktor deklariert oder Zuweisungsoperator bewegen
  • (C++ 11) Sie haben ausdrücklich gesagt, den Compiler nicht eins erzeugen mit X(const X&) = delete;

The Copy Assignment Operator (z. B., X& operator=(const X&)) implizit nicht erzeugt werden, wenn:

  • haben Sie explizit Betreiber eine Kopie Zuordnung deklariert (für Klasse X ein operator=X, X& oder const X&)
  • gibt es ein Datenelement in der Klasse unter das ist nicht kopierbar (z. B. eine Referenz, ein const Objekt oder eine Klasse mit keinem oder einem nicht zugreifbaren Zuweisungsoperator)
  • die Basisklasse ist nicht kopierzuweisbar
  • (C++ 11) Sie haben erklärt ein Konstruktor verschieben oder Zuweisungsoperator
  • (C++ 11) explizit den Compiler gesagt bewegen nicht eins erzeugen X& operator=(const X&) = delete;

The Destructor (zB mit,

  • Sie erklärt ein destructor
  • (C++ 11) haben Sie explizit hav: ~X()) nicht implizit, wenn erzeugt werden e sagte ausdrücklich den Compiler nicht eins erzeugen mit ~X() = delete;

The Move Constructor (C++ 11) (zB X(X&&)) nicht implizit, wenn generiert werden:

  • Sie haben explizit erklärt ein Umzug Konstruktor (für Klasse X, ein Konstruktor unter X&&)
  • Sie haben Betreiber eine Kopie Zuordnung erklärt, Copykonstruktor, destructor oder Zuweisung ope bewegen rator
  • gibt es ein Datenelement in Ihrer Klasse, die sich nicht bewegen-konstruiert werden kann (ist const, ist eine Referenz, oder hat eine gelöschte, unzugängliche oder nicht eindeutiger Zug Konstruktor)
  • die Basisklasse nicht bewegen-konstruiert werden kann
  • Sie haben ausdrücklich gesagt, den Compiler nicht eins zu erzeugen X(X&&) = delete;

The Move Assignment Operator (C++ 11) (zB, X& operator=(X&&)) implizit nicht erzeugt werden, wenn:

  • haben Sie explizit Bediener eine Bewegung Zuordnung deklariert (für Klasse X, ein operator= unter X&&)
  • Sie erklärt eine Kopie Zuweisungsoperator haben, kopieren Konstruktor, Destruktor oder Verschiebekonstruktor
  • Es gibt ein Datenelement in Ihrer Klasse, dem keine Verschiebung zugewiesen werden kann (ist const, ist eine Referenz oder hat einen gelöschten, nicht zugreifbaren oder mehrdeutigen Bewegungszuweisungsoperator)
  • die Basisklasse kann nicht sein-Move zugewiesen
  • Sie explizit den Compiler einen nicht X& operator=(X&&) = delete;
+0

Nun, in all diesen zweiten Punkt unter Verwendung gesagt zu erzeugen, wird es als 'delete' implizit definiert, nur werden d. –

+1

+1 Vergessen Sie nicht die C++ 11-Zusätze, wo Sie explizit deklarieren können, dass sie nicht erstellt werden sollten ('A (const A &) = delete;'), und Sie sollten Move Constructors der Vollständigkeit halber hinzufügen. – pickypg

+0

@pickypg: Ich bin nicht wirklich sicher über Move-Konstruktoren, ich würde mich freuen, wenn Sie die gewünschte Information zu meiner Antwort hinzufügen –

Verwandte Themen