Ich habe versucht, einen Move-Konstruktor für eine Klasse ohne einen Kopierkonstruktor zu implementieren. Ich habe einen Fehler bekommen, dass der Standardkonstruktor für ein Mitglied der Klasse fehlte.Warum benötigt ein Verschiebungskonstruktor einen Standardkonstruktor für seine Mitglieder?
Hier ist ein triviales Beispiel um dies zu verdeutlichen:
struct A {
public:
A() = delete;
A(A const&) = delete;
A(A &&a) {}
};
struct B {
A a;
B() = delete;
B(B const&) = delete;
B(B &&b) {}
};
dies kompilieren Der Versuch, die ich erhalten:
move_without_default.cc: In constructor ‘B::B(B&&)’:
move_without_default.cc:15:11: error: use of deleted function ‘A::A()’
B(B &&b) {}
^
move_without_default.cc:6:2: note: declared here
A() = delete;
^
Warum ist das ein Fehler? Irgendwie in der Nähe?
Ersetze '{}' mit '= default;' – cpplearner
Weil 'A's Standardkonstruktor gelöscht wird, aber' B' verwendet es. – tkausl
Ein leerer Move-Konstruktor versucht nicht automatisch, eine member-by-member-Verschiebung durchzuführen. Ihr Move-Konstruktor versucht, "a" standardmäßig zu konstruieren, nicht move-construct. – user2357112