Construtor / atribuição de movimentação padrão e construtor / atribuição de cópia excluída

De acordo com o padrão,

Se a definição de uma classe X não declarar explicitamente um construtor de movimentação, uma será implicitamente declarada como padrão se e somente se

- X não possui um construtor de cópias declarado pelo usuário,

- X não possui um operador de atribuição de cópia declarado pelo usuário,

- X não possui um operador de atribuição de movimentação declarado pelo usuário e

- X não possui um destruidor declarado pelo usuário.

Agora, o seguinte falha ao compilar

# include <utility>

class Foo
{
public:
  Foo() = default;
  Foo(Foo const &) = delete;
};

int main()
{
  Foo f;
  Foo g(std::move(f)); // compilation fails here
  return 0;
}

Portanto, parece que uma função excluída é considerada definida pelo usuário, o que faz sentido (não é sua implementação padrão). No entanto, nesse caso específico, como o padrão de exclusão de construtor / atribuição de cópia excluído moveria o construtor / atribuição?

Eu acho que essa questão tem importância prática porque geração manual e esp. a manutenção de tais funções padrão é suscetível a erros, enquanto, ao mesmo tempo, o aumento (justo) do uso de classes comostd::unique_ptr como os alunos fizeram das classes não copiáveis bestas muito mais comuns do que costumavam ser.

questionAnswers(3)

yourAnswerToTheQuestion