Expliziter Verschiebungskonstruktor
Versucht, den folgenden Code zu kompilieren:
struct Foo
{
explicit Foo ( void ) { }
explicit Foo ( Foo&& rhs ) { }
};
Foo bar ( void )
{
return Foo();
}
Den folgenden Fehler erhalten:
Aufruf des implizit gelöschten Kopierkonstruktors von 'Foo'
Nun, es ist ziemlich offensichtlich, dass der Kopierer implizit gelöscht wird.
Frage 1: Warum braucht der Compiler den Kopierer vonFoo
? Ich habe den Rückgabewert von erwartetbar
aus dem Wert konstruiert werdenFoo()
mit move-ctor.
Dann erkläre ich den move-ctor als implizit und alles wird erfolgreich kompiliert.
Frage 2: Warum braucht der Compiler keinen copy-ctor mehr, wenn ich den move-ctor als implizit deklariere?
Frage 3: Was machtexplicit
Schlüsselwort bedeutet im Kontext des Kopierens und Verschiebens von ctors, da es definitiv etwas anderes als der Kontext von regulären ctors bedeutet.