Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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::narrowgarantiza la conversión sin pérdida e iniciagsl::narrowing_errorsi no es posible. -
gsl::narrow_castindica 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 };