Constructor de movimiento explícito

Intentando compilar el siguiente código:

struct Foo
{
    explicit Foo ( void ) { }
    explicit Foo ( Foo&& rhs ) { }
};

Foo bar ( void )
{
    return Foo();
}

Obteniendo el siguiente error:

llamada al constructor de copia implícitamente eliminado de 'Foo'

Bueno, es bastante obvio que el copiador se elimina implícitamente.

Pregunta 1: ¿Por qué el compilador necesita el copiador deFoo? Esperaba el valor de retorno debar ser construido a partir del valorFoo() con move-ctor.

Luego vuelvo a declarar el move-ctor como implícito y todo se compila con éxito.

Pregunta 2: ¿Por qué el compilador ya no necesita copy-ctor cuando vuelvo a declarar el move-ctor como implícito?

Pregunta 3: Que haceexplicit palabra clave significa en el contexto de copiar y mover ctors, ya que definitivamente significa algo diferente del contexto de los ctors regulares.

Respuestas a la pregunta(3)

Su respuesta a la pregunta