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 você definir ou =delete qualquer operação padrão, defina ou =delete todas elas

Presume-se que operações especiais, como construtores, alterem o comportamento dos tipos para que eles confiem mais em mecanismos de linguagem para impor automaticamente cenários específicos. O exemplo canônico é o gerenciamento de recursos. Se você definir, usar o valor padrão ou excluir explicitamente qualquer uma dessas operações especiais, ele sinalizará que você deseja evitar qualquer tratamento especial de um tipo. É inconsistente deixar as outras operações não especificadas, ou seja, definidas implicitamente como excluídas pelo compilador.

Comentários

Essa verificação implementa a regra de cinco, que trata as seguintes operações como especiais:

  • construtor de cópia,
  • construtores de movimento,
  • operador de atribuição de cópia,
  • mover operadores de atribuição e
  • destruidores.

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 as definidas explicitamente. No entanto, se você especificar algum deles, precisará especificar todos.

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

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 declaração no_warning::S define ou exclui todas as cinco funções de membro especiais.

// 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;
}