Aviso C26474

Não converta os tipos ponteiro quando a conversão puder ser implícita.

Diretrizes Principais do C++:
Type.1: evitar conversões

Em alguns casos, as conversões implícitas entre tipos de ponteiro são seguras e não exigem que você escreva uma expressão de conversão específica. Essa regra localiza instâncias de conversões desnecessárias que você pode remover com segurança.

Comentários

A ID da regra deve ser interpretada como "Uma conversão implícita não é usada onde é aceitável".

Essa regra só é aplicável a ponteiros. Ela verifica conversões estáticas e conversões de reinterpretação.

Esses casos são conversões de ponteiro aceitáveis que não devem usar expressões explícitas de conversão:

  • conversão para nullptr_t;
  • conversão para void*;
  • conversão de um tipo derivado no respectivo tipo 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 lógico 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 conversões para acessar funções 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
}