2015-03-10 12 views
6

Pro this presentation, wenn entweder der Kopierkonstruktor oder der Kopierzuweisungsoperator "Benutzer deklariert" ist, werden keine impliziten Verschiebeoperationen generiert. Ist der Kopierkonstruktor oder Kopierzuweisungsoperator delete als "Benutzer deklariert" gezählt?Wird ein Kopierkonstruktor oder Kopierzuweisungsoperator als "Benutzer deklariert" gezählt?

struct NoCopy { 
    NoCopy(NoCopy&) = delete; 
    NoCopy& operator=(const NoCopy&) = delete; 
}; 

Wird implizite Verschiebeoperationen für die NoCopy Klasse erzeugt werden? Oder zählt das Löschen der relevanten Kopiervorgänge als "Benutzer deklariert" und hemmt somit die implizite Bewegungserzeugung?

Wenn möglich, würde ich eine Antwort bevorzugen, die auf die relevanten Teile des Standards verweist.

Antwort

6

Laut Folie 14 Ihrer Präsentation ist ein Konstruktor für gelöschte Kopien "Benutzer deklariert", wodurch die Generierung von Bewegungen verhindert wird.

+0

Nun ... das ist, was ich bekomme, wenn ich versuche, über C++ zu lesen, bevor ich vollständig wach bin. Danke, dass du darauf hingewiesen hast. – acm

8

Der Begriff "Benutzer deklariert" hat keine formale Definition im Standard. Es soll das Gegenteil von "implizit erklärt" im Zusammenhang mit speziellen Mitgliedsfunktionen sein. [Dcl.fct.def.default]/4 könnte etwas deutlicher über diese Tatsache, aber die Absicht ist es:

Explizit ausgefallene Funktionen und implizit deklarierte Funktionen gemeinsam vorbelegt Funktionen aufgerufen werden, und Die Implementierung muss implizite Definitionen für sie enthalten (12.1 12.4, 12.8), was bedeuten kann, dass sie als gelöscht definiert werden. Eine spezielle Memberfunktion ist , die vom Benutzer bereitgestellt wird, wenn sie von einem Benutzer deklariert und bei ihrer ersten Deklaration nicht explizit voreingestellt oder gelöscht wird. Eine vom Benutzer bereitgestellte explizit vorgegebene Funktion (d. H. Explizit nach ihrer ersten Deklaration voreingestellt) wird an dem Punkt definiert, an dem sie explizit voreingestellt ist; Wenn eine solche Funktion implizit als gelöscht definiert ist, ist das Programm schlecht formatiert.

Sowohl NoCopy(NoCopy&) = delete; als auch NoCopy& operator=(const NoCopy&) = delete; sind Deklarationen spezieller Elementfunktionen. Da Sie explizit deklarieren, im Gegensatz zu dem Compiler, sie implizit zu deklarieren, werden sie vom Benutzer deklariert. Diese Erklärungen werden daher die impliziten Erklärungen des Umzug Konstruktor unterdrücken und Zuweisungsoperator pro [class.copy]/9 bewegen:

Wenn die Definition einer Klasse X nicht explizit deklariert einen Umzug Konstruktor, wird man implizit sein als ausgefallen erklärt, wenn und nur wenn

-X kein benutzer erklärt Copykonstruktor haben,

-X kein Benutzer deklarierte Kopie Zuweisungsoperator hat,

-X hat keinen benutzer erklärte bewegen Zuweisungsoperator,

-X hat einen benutzer erklärte destructor nicht hat, und

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