Aviso C26475
Não use conversões C do estilo de função.
Diretrizes Principais do C++: ES.49: se você precisar usar uma conversão, use uma conversão nomeada
Conversões de estilo de função (por exemplo, int(1.1)
) são outra forma de conversões de estilo C (como (int)1.1
), que têm segurança questionável. Especificamente, o compilador não tenta verificar se alguma perda de dados pode ocorrer em conversões C ou em conversões de funções. Em ambos os casos, é melhor evitar a conversão ou usar um inicializador entre chaves, se possível. Se nenhum dos dois funcionar, as conversões estáticas poderão ser adequadas, mas ainda é melhor usar utilitários da Biblioteca de Suporte de Diretrizes:
gsl::narrow
garante a conversão sem perdas e gerarágsl::narrowing_error
se não for possível.gsl::narrow_cast
afirma claramente que a conversão pode perder dados e isso é aceitável.
Comentários
Essa regra é acionada apenas para constantes de tipos primitivos. O compilador pode detectar claramente a perda de dados nesses casos e emitir um erro se um inicializador preparado for usado. Os casos que exigiriam execução em tempo de execução são sinalizados por C26493 NO_CSTYLE_CAST.
Inicializadores padrão não são sinalizados (por exemplo,
int()
).
Exemplo
Exemplo de conversão perigosa:
constexpr auto planck_constant = float( 6.62607004082e-34 ); // C26475
Erro do compilador para conversão perigosa, detectando uma possível perda de dados:
constexpr auto planck_constant = float{ 6.62607004082e-34 }; // Error C2397
Para corrigir a conversão perigosa, use um tipo primitivo de tamanho apropriado:
constexpr auto planck_constant = double{ 6.62607004082e-34 };