2013-05-27 9 views
9

Heute habe ich wie dieser über einen Code-Schnipsel gestolpert:C++ Syntax: default und löschen Modifikatoren

class A 
{ 
    A() = default; 
    A (const A&) = delete; 

    ... 
} 

habe ich auch nie die oder Standard Stichwort löschen gesehen. Sind sie Teil von C++ 11 Std? Und wofür werden sie verwendet?

+0

Sie sind Funktionen in C++ 11 eingeführt. Sie ermöglichen die explizite Deaktivierung der Verwendung der Funktion oder die Anweisung an den Compiler, den Standardkonstruktor zu verwenden. Überprüfen Sie [hier] (http://en.wikipedia.org/wiki/C%2B%2B11#Explicitely_defaulted_and_deleted_special_member_functions). –

+0

ja, das sind sie. 8.4.2 und 8.4.3 –

+1

[Und hier sind einige Beispiele] (http://stackoverflow.com/a/7234700/1364752). – Morwenn

Antwort

11

Spezielle Elementfunktionen können jetzt als Standard oder gelöscht werden.

Eine gelöschte Elementfunktion nimmt immer noch an der Überladungsauflösung teil, aber wenn sie ausgewählt wird, ist das Programm schlecht formatiert und die Kompilierung stoppt mit einer nützlichen Diagnose. Dies ist der richtige Weg, Dinge wie nicht kopierbare Klassen zu schreiben, und der Benutzer erhält eine korrekte Fehlermeldung.

Eine voreingestellte Mitgliedsfunktion "tut was sie soll", z. Ein default-Standardkonstruktor default initialisiert alle Basen und Member und hat einen leeren body; Ein vordefinierter Kopierkonstruktor kopiert jedes Basis- und Memberobjekt, und ein voreingestellter Zuweisungsoperator ordnet jede Basis und jedes Mitgliedsobjekt zu. Wenn eine dieser Operationen nicht zulässig ist (z. B. wenn Sie Referenzmitglieder haben), wird die Standardfunktion für Mitglieder als gelöscht definiert.

Beachten Sie, dass Ihre erste Erklärung-Definition A() = default; der Konstruktor A::A()benutzer erklärt macht aber nicht benutzerdefinierten; dies ist wichtig für die Klassifizierung von A, z.B. ob es POD ist. (Und feststellen, dass dies von struct A { A(); }; A::A() = default; unterscheidet, die ist benutzerdefiniert.)

Eine weitere schöne Konsequenz ist die Klärung der implizit erzeugt Dinge: Wenn Sie nicht bestimmte Funktionen selbst schreiben überhaupt (wie Kopierkonstruktoren), man bekommt implizit für Sie deklariert. Wenn der implizit deklarierte ist odr-used, wird implizit als defaulted definiert, und wenn es nicht möglich ist (z. B. wenn die Klasse nicht kopierbare Mitglieder hat), wird es implizit definiert als gelöscht. Das ist im Allgemeinen ein guter Weg, um Dinge wie Nichtkopierbarkeit und Nicht-Zuweisbarkeit zu propagieren, zumindest in Bezug auf die Sprache und die daraus resultierende Diagnose.

+1

Ich denke, dass Sie tatsächlich einen Zuweisungsoperator einer Klasse mit einem Referenzmitglied vorbelegen können - der Zuweisungsoperator wird dann jedoch als "gelöscht" definiert - dasselbe, was passieren würde, wenn Sie den Compiler generieren lassen würden . – Xeo

+0

@ Xeo: Ah, ja, das macht mehr Sinn. Vielen Dank! Bearbeitet. –