Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
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;
}