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