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