Явный конструктор перемещения

Попытка скомпилировать следующий код:

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

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

Получаем следующую ошибку:

вызов неявно удаленного конструктора копии 'Foo'

Ну, совершенно очевидно, что copy-ctor неявно удаляется.

Вопрос 1: Зачем компилятору нужен copy-ctorFoo? Я ожидал, что возвращаемое значениеbar быть построенным из значенияFoo() с ход-ctor.

Затем я объявляю move-ctor неявным, и все успешно компилируется.

Вопрос 2: Почему компилятору больше не нужен copy-ctor, когда я повторно объявляю move-ctor как неявный?

Вопрос 3: Что значитexplicit Ключевое слово означает в контексте копирования и перемещения ctors, поскольку оно определенно означает нечто отличное от контекста обычных ctors.

Ответы на вопрос(3)

Ваш ответ на вопрос