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?
Erstellen Sie keinen Move-Konstruktor:
%Vor%Der Verschiebungskonstruktor wird nicht automatisch generiert, solange ein benutzerdefinierter Kopierkonstruktor vorhanden ist, daher wird der Kopierkonstruktor aufgerufen.
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%