Partilhar via


Aviso C26475

Não use C-casts de estilo de função.

Diretrizes principais do C++: ES.49: Se precisar usar uma conversão, utilize uma conversão nomeada

Moldes de estilo de função (por exemplo, int(1.1)) são outra forma de moldes de estilo C (como (int)1.1), que têm segurança questionável. Especificamente, o compilador não tenta verificar se pode ocorrer alguma perda de dados em C-casts ou em function casts. Em ambos os casos, é melhor evitar a fundição ou usar um inicializador com suporte, se possível. Se nenhum dos dois funcionar, os moldes estáticos podem ser adequados, mas ainda é melhor usar utilitários da Biblioteca de Suporte de Diretrizes:

  • gsl::narrow garante uma conversão sem perdas e lança gsl::narrowing_error se não for possível.
  • gsl::narrow_cast afirma claramente que a conversão pode perder dados e é aceitável.

Observações

  • Esta regra é acionada apenas para constantes de tipos primitivos. O compilador pode detetar claramente a perda de dados nesses casos e emite um erro se um inicializador travado for usado. Os casos que exigiriam execução em tempo de execução são sinalizados por C26493 NO_CSTYLE_CAST.

  • Os 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, detetando perda potencial 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 };