Compartir vía


Advertencia C26475

No usar conversiones C de estilo de función.

C++ Core Guidelines: ES.49: si tiene que usar una conversión, use una conversión con nombre

Las conversiones de estilo de función (por ejemplo, int(1.1)) son otra forma de conversiones de estilo C (como (int)1.1), que tienen seguridad cuestionable. En concreto, el compilador no intenta comprobar si se puede producir una pérdida de datos en las conversiones de C o en las conversiones de función. En ambos casos, es mejor evitar la conversión o usar un inicializador entre llaves si es posible. Si ninguno funciona, las conversiones estáticas pueden ser adecuadas, pero es mejor usar utilidades de la Biblioteca de compatibilidad de directrices:

  • gsl::narrow garantiza la conversión sin pérdida e inicia gsl::narrowing_error si no es posible.
  • gsl::narrow_cast indica claramente que la conversión puede perder datos y es aceptable.

Comentarios

  • Esta regla solo se activa para constantes de tipos primitivos. El compilador puede detectar claramente la pérdida de datos en estos casos y emite un error si se usa un inicializador entre llaves. Los casos que requerirían la ejecución en tiempo de ejecución se marcan mediante C26493 NO_CSTYLE_CAST.

  • Los inicializadores predeterminados no están marcados (por ejemplo, int()).

Ejemplo

Ejemplo de conversión peligrosa:

constexpr auto planck_constant = float( 6.62607004082e-34 ); // C26475

Error del compilador para la conversión peligrosa, se detecta una posible pérdida de datos:

constexpr auto planck_constant = float{ 6.62607004082e-34 }; // Error C2397

Para corregir la conversión peligrosa, use un tipo primitivo de tamaño adecuado:

constexpr auto planck_constant = double{ 6.62607004082e-34 };