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.