Visual Studio 2015 Reports C2280: Explorando o problema do "Construtor de cópia excluída"
No Visual Studio 2013, a compilação do código a seguir é executada sem erros :
class A {
public:
A(){}
A(A &&{}){};
};
int main(int, char*) {
A a;
new A(a);
return 0;
}
No entanto, após a compilação no Visual Studio 2015 RC, o compilador gera o erro C2280:
1> c:\dev\foo\foo.cpp(11): error C2280: 'A::A(const A &)' : attempting to reference a deleted function
O motivo do erro
O Visual Studio 2015 se comporta de maneira diferente de seu antecessor. De acordo com o padrão C, se uma definição de classe declara um construtor de movimentação ou um operador de atribuição de movimentação, o compilador gera implicitamente um construtor de cópia e um operador de atribuição de cópia como excluídos. Este é o caso do trecho de código fornecido, onde o construtor de movimentação está presente.
Resolvendo o problema
Para resolver o erro de compilação, a declaração explícita da cópia construtor e operador de atribuição de cópia como padrão são necessários:
class A {
public:
A(){}
A(A &&{}){};
A(const A&{}) = default;
};
Com esta modificação, o compilador gerará o construtor de cópia necessário e o operador de atribuição de cópia sem marcá-los como excluídos.
Considerações Adicionais
Se a classe definir a semântica de movimentação, geralmente é recomendado definir também um operador de atribuição de movimentação e um destruidor. Seguir o princípio da "Regra dos Cinco" pode ajudar a garantir o gerenciamento adequado de recursos.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3