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 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::narrowgarante uma conversão sem perdas e lançagsl::narrowing_errorse não for possível. -
gsl::narrow_castafirma 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 };