Compartilhar via


Aviso do compilador (nível 4) C5267

A definição de construtor/operador de atribuição de cópia implícita para 'tipo' foi preterida porque tem um operador de atribuição/construtor de cópia fornecido pelo usuário

Comentários

O C++ Standard preterido (mas não removeu) a geração implícita de operadores de cópia e atribuição sob algumas condições. O compilador MSVC ainda gera os operadores de cópia e atribuição nessas condições, mas pode alterar seu comportamento no futuro se o padrão remover o comportamento preterido. O objetivo deste aviso é ajudar a preparar seu código para o futuro se o comitê decidir remover essa funcionalidade.

As seções relevantes no padrão C++ são:

  • class.copy.ctor parágrafo 6, que diz: "Se a definição de classe não declarar explicitamente um construtor de cópia, um não explícito é declarado implicitamente. Se a definição de classe declarar um construtor move ou um operador de atribuição de movimentação, o construtor de cópia declarado implicitamente será definido como excluído; caso contrário, ele é padrão. O último caso será preterido se a classe tiver um operador de atribuição de cópia declarado pelo usuário ou um destruidor declarado pelo usuário."
  • Anexo D D.8, que diz: "A definição implícita de um construtor de cópia como padrão será preterida se a classe tiver um operador de atribuição de cópia declarado pelo usuário ou um destruidor declarado pelo usuário. A definição implícita de um operador de atribuição de cópia como padrão será preterida se a classe tiver um construtor de cópia declarado pelo usuário ou um destruidor declarado pelo usuário. É possível que versões futuras do C++ especifiquem que essas definições implícitas sejam excluídas."

Exemplo

O código a seguir mostra o aviso C5267 quando uma função especial gerada implicitamente é chamada, mas não é definida explicitamente. Ambos /W4 e /w45267 são obrigados a produzir este aviso.

// C5267.cpp
// compile using: /W4 /w45267
struct CopyCtorOnly
{
    CopyCtorOnly() = default;
    CopyCtorOnly(const CopyCtorOnly&) {} // C5267
};

struct CopyAssignOpOnly
{
    CopyAssignOpOnly() = default;
    CopyAssignOpOnly& operator=(const CopyAssignOpOnly&) // C5267
    {
        return *this;
    }
};

int main()
{
    CopyCtorOnly a1, a2;
    a1 = a2; // Calls deprecated copy assignment operator

    CopyAssignOpOnly b1;
    CopyAssignOpOnly b2 = b1; // Calls deprecated copy constructor
}

Para resolver esse problema, defina explicitamente o construtor de cópia ausente ou operador de atribuição de cópia.

Confira também

Funções explicitamente usadas como padrão e excluídas