Bewegungskonstruktor wird deaktiviert

7

Ich möchte den Move-Konstruktor in der Klasse deaktivieren. Anstatt sich zu bewegen, möchte ich auf dem Kopierkonstruktor basieren. Wenn ich versuche, diesen Code zu schreiben:

%Vor%

während der Kompilierung habe ich einen Fehler erhalten:

  

Fehler C2280: 'Boo :: Boo (Boo & amp; & amp;)': versucht, eine gelöschte Funktion zu referenzieren

Wie kann ich den Verschiebungskonstruktor deaktivieren und stattdessen Kopien erzwingen?

    
user5929018 15.02.2016, 09:36
quelle

2 Antworten

17

Erstellen Sie keinen Move-Konstruktor:

%Vor%

Der Verschiebungskonstruktor wird nicht automatisch generiert, solange ein benutzerdefinierter Kopierkonstruktor vorhanden ist, daher wird der Kopierkonstruktor aufgerufen.

    
Marian Spanik 15.02.2016, 09:37
quelle
4

Durch das Markieren einer Funktion als =delete wird die Funktion für die Überladungsauflösung verfügbar gemacht. Wenn sie jedoch ausgewählt wird, schlägt die Kompilierung fehl. Diese Funktionalität ist nicht auf Konstruktoren und andere Sonderfunktionen beschränkt (siehe hier) . Zuvor (ca. C ++ 03) hat das private Mitglied ein ähnliches Ergebnis erzielt.

Daher bedeutet der Code wie im Beispiel, dass Sie die Konstruktion eines Objekts der Klasse aus einem temporären oder ablaufenden Wert (rvalues) - dem Move-Konstruktor - verbieten.

Um dies zu korrigieren, entfernen Sie den Verschiebungskonstruktor vollständig. Im Falle der Klasse wird, sobald ein Kopierkonstruktor vorhanden ist (benutzerdefiniert), die Bewegung implizit sowieso nicht erzeugt (Konstruktor bewegen und Zuweisungsoperator verschieben).

%Vor%     
Niall 15.02.2016 10:04
quelle

Tags und Links