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.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage