Default Konstruktor / Zuweisung verschieben und Kopierkonstruktor / Zuweisung löschen

Nach dem Standard,

Wenn die Definition einer Klasse X einen Verschiebungskonstruktor nicht explizit deklariert, wird einer nur dann implizit als Standard deklariert, wenn

- X hat keinen vom Benutzer deklarierten Kopierkonstruktor,

- X hat keinen vom Benutzer deklarierten Kopierzuweisungsoperator.

- X hat keinen vom Benutzer deklarierten Operator für Verschiebungszuweisungen, und

- X hat keinen vom Benutzer deklarierten Destruktor.

Now das Folgende kann nicht kompiliert werden

# include <utility>

class Foo
{
public:
  Foo() = default;
  Foo(Foo const &) = delete;
};

int main()
{
  Foo f;
  Foo g(std::move(f)); // compilation fails here
  return 0;
}

So scheint es, dass eine gelöschte Funktion als benutzerdefiniert betrachtet wird, was sinnvoll ist (es ist nicht die Standardimplementierung). Wie würde jedoch in diesem speziellen Fall die Standardeinstellung zum Verschieben des Konstruktors / der Zuweisung für den Kopierkonstruktor / die Zuweisung gelöscht?

Ich denke, diese Frage hat praktische Bedeutung, weil manuelle Generierung und esp. Die Beibehaltung solcher Standardfunktionen ist fehleranfällig, während gleichzeitig die (gerechte) Zunahme der Verwendung von Klassen wiestd::unique_ptr Als die Klassenmitglieder nicht kopierbare Klassen machten, waren sie weitaus häufiger als früher.

Antworten auf die Frage(6)

Ihre Antwort auf die Frage