Partilhar via


Aviso C26432

If you define or delete any default operation in the type 'type-name', define or delete them all (c.21).

Diretrizes principais do C++:
C.21: Se definires ou =delete qualquer função de cópia, de movimento ou destrutora, define ou =delete todas elas

Operações especiais, como construtores, são assumidas para alterar o comportamento de tipos, de modo que eles dependem mais de mecanismos de linguagem para impor automaticamente cenários específicos. O exemplo canônico é o gerenciamento de recursos. Se você definir explicitamente, padronizar ou excluir qualquer uma dessas operações especiais, isso sinaliza que você deseja evitar qualquer manipulação especial de um tipo. É inconsistente deixar as outras operações não especificadas, ou seja, implicitamente definidas como excluídas pelo compilador.

Observações

Esta verificação aplica a regra dos cinco, que trata as seguintes operações como especiais:

  • construtores de cópia,
  • construtores de movimento
  • operadores de atribuição de cópias,
  • mover operadores de atribuição, e
  • destrutores.

A regra não verifica se as operações são definidas da mesma maneira. Não há problema em misturar operações excluídas e padrão com operações explicitamente definidas. No entanto, caso especifique algum, deve especificar todos.

Os níveis de acesso não são importantes e também podem ser mistos.

O aviso sinaliza a primeira definição de função não estática de um tipo, uma vez por tipo.

Exemplo

Neste exemplo, warning::S define apenas um construtor padrão e um destruidor. A no_warning::S declaração define ou exclui todas as cinco funções especiais de membro.

// C26432.cpp
namespace warning
{
    struct S
    {
        S() noexcept { ++_count; }
        ~S() { --_count; } // C26432 because only the constructor and destructor are explicitly defined.
        static unsigned _count;
    };
    unsigned S::_count = 0;
}

namespace no_warning
{
    struct S
    {
        S() noexcept { _count++;  }
        S(const S&) = delete;
        S(S&&) = delete;
        S& operator=(const S&) = delete;
        S& operator=(S&&) = delete;
        ~S() { --_count; }
        static unsigned _count;
    };
    unsigned S::_count = 0;
}