2015-08-06 10 views
7

Die Frage ist, wie mein Titel sagt.Wird ein Standard-Move-Konstruktor vom Benutzer deklariert?

Ich frage, weil ich eine Klasse mit einem notleidenden bewegen Konstruktor aber Code versucht Kopie Zuordnung auszuführen versagt die besagt, dass der Kopierzuweisungsoperator ist gelöscht (nach Visual Studio 2015).

So überprüfte ich die Regeln here für implizit deklariert Kopie Zuweisungsoperatoren:

Die implizit deklarierte oder notleidenden Kopie Zuweisungsoperator für die Klasse T ist in einem der folgenden als gelöscht definiert ist wahr:

  • ...
  • T hat eine benutzer erklärt Bewegung Konstruktor
  • T hat ein benutzer erklärt Umzug Zuweisungsoperator

Also im Grunde bin ich, wenn ein vorbelegt bewegen Konstruktor zählt als benutzer erklärt nicht sicher. Mein Bauchgefühl sagt mir ja, aber wenn es um Standard geht, möchte ich immer sicher sein, da Annahmen teuer sein können.

+0

Ja – Praetorian

+0

@Praetorian Fair genug. Warum beschweren sich VS2015? Wenn ich meinen Standard-Move-Konstruktor entferne, wird Code kompiliert. –

+0

Vermutlich enthält Ihre Klasse Datenelemente, die alle kopierbar sind. Wenn Sie den vom Benutzer deklarierten Move-Konstruktor entfernen, gibt es nichts, was die implizite Deklaration eines Kopierzuweisungsoperators – Praetorian

Antwort

1

Der Standard sagt:

12,8 Kopieren und Verschieben von Klassenobjekten [class.copy]

Wenn die Klassendefinition nicht explizit eine Kopie Konstruktor deklarieren, wird eine implizit deklariert. Wenn die Definition der Klasse einen Verschiebungskonstruktor oder einen Verschiebungszuweisungsoperator deklariert, wird der implizit deklarierte Kopierkonstruktor als gelöscht definiert. Ansonsten ist es als default definiert (8.4). Letzterer Fall ist veraltet, wenn die Klasse einen vom Benutzer deklarierten Kopierzuweisungsoperator oder einen vom Benutzer deklarierten Destruktor hat.

Wenn die Klassendefinition einen Kopierzuweisungsoperator nicht explizit deklariert, wird einer implizit deklariert. Wenn die Klassendefinition einen Verschiebungskonstruktor oder einen Verschiebungszuweisungsoperator deklariert, wird der implizit deklarierte Kopierzuordnungsoperator als gelöscht definiert; Ansonsten ist es als default definiert (8.4). Der letztere Fall ist veraltet, wenn die Klasse einen vom Benutzer deklarierten Kopierkonstruktor oder einen vom Benutzer deklarierten Destruktor hat.

Ihre Klasse hat den move-Konstruktor als Standard angegeben, wird jedoch explizit deklariert. So wird standardmäßig der implizit deklarierte Kopierkonstruktor und Kopierzuweisungsoperator als gelöscht definiert.

8.4.2 Explizit ausgefallene Funktionen [dcl.fct.def.default]

Explizit ausgefallene Funktionen und implizit deklarierte Funktionen werden gemeinsam notleidenden Funktionen aufgerufen, und die Umsetzung wird für sie implizite Definitionen liefern (12.1 12.4, 12.8), was bedeuten könnte, sie als gelöscht zu definieren. Eine Funktion wird vom Benutzer bereitgestellt, wenn sie von einem Benutzer deklariert und nicht explizit bei der ersten Deklaration voreingestellt oder gelöscht wird. Eine vom Benutzer bereitgestellte explizit voreingestellte Funktion (d. H., explizit nach seiner ersten Deklaration voreingestellt) wird an dem Punkt definiert, an dem es explizit voreingestellt ist.

Mit dieser Terminologie wird der Move-Konstruktor vom Benutzer deklariert, aber nicht vom Benutzer bereitgestellt.

+0

Die Frage ist über Kopie * Zuweisung *, nicht kopieren * Konstruktion *. Meine Klasse hat bereits einen standardmäßigen Kopierkonstruktor. –

+0

Das Gleiche gilt für den Zuweisungsoperator. Zitiert darüber. –

0

A vorbelegt spezielle Elementfunktion ist benutzer- erklärt, aber es ist auch definiert vom Benutzer als vorbelegt. Der Standard definiert nicht explizit den Begriff "vom Benutzer deklariert", sondern im Wesentlichen jede spezielle Mitgliedsfunktion, die vom Benutzer ausgeschrieben werden muss. Das folgende erklärt also einen Konstruktor und definiert ihn als Standard.

struct X { 
    X() = default; // declaration and definition 
}; 

Definieren einer Elementfunktion als ausgefallen bedeutet die Definition der impliziten Definition entspricht. Es wird vom Benutzer deklariert, weil es vom Benutzer abgetippt werden musste.

Verwandte Themen