"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Por que o Visual Studio 2015 relata o erro C2280 “Construtor de cópia excluído” ao compilar o código do construtor de movimentação?

Por que o Visual Studio 2015 relata o erro C2280 “Construtor de cópia excluído” ao compilar o código do construtor de movimentação?

Publicado em 17/11/2024
Navegar:405

Why Does Visual Studio 2015 Report Error C2280 \

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.

Tutorial mais recente Mais>

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