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