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.