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.
Não lance entre tipos de ponteiro quando a conversão puder estar implícita.
Diretrizes principais do C++:
Tipo.1: Evite moldes
Em alguns casos, as transmissões implícitas entre tipos de ponteiro são seguras e não exigem que você escreva uma expressão de transmissão específica. Esta regra encontra instâncias de transmissões desnecessárias que você pode remover com segurança.
Observações
O ID da regra deve ser interpretado como "Um elenco implícito não é usado onde é aceitável".
Esta regra só é aplicável a ponteiros. Verifica moldes estáticos e reinterpreta moldes.
Esses casos são conversões de ponteiro aceitáveis que não devem usar expressões de transmissão explícitas:
- conversão para
nullptr_t; - conversão para
void*; - conversão de um tipo derivado para sua base ao invocar uma função de membro base que não está oculta pelo tipo derivado.
Exemplo 1
Uma conversão desnecessária oculta um erro de lógica neste exemplo:
template<class T>
bool register_buffer(T buffer) {
auto p = reinterpret_cast<void*>(buffer); // C26474, also 26490 NO_REINTERPRET_CAST
// To fix, declare buffer as T*, and use this to define p:
// auto p = buffer;
return buffers_.insert(p).second;
}
void merge_bytes(std::uint8_t *left, std::uint8_t *right)
{
if (left && register_buffer(*left)) { // Unintended dereference!
// ...
if (right && register_buffer(right)) {
// ...
}
}
}
Exemplo 2
Este exemplo demonstra o uso de casts para acessar funções de membro de classe base:
struct struct_1
{
void foo();
void bar();
};
struct struct_2 : struct_1
{
void foo(); // this definition hides struct_1::foo
};
void fn(struct_2* ps2)
{
static_cast<struct_1*>(ps2)->foo(); // This cast is necessary to access struct_1::foo
// Alternatively, use ps2->struct_1::foo();
static_cast<struct_1*>(ps2)->bar(); // This cast is unnecessary and can be done implicitly
}