C26475 NO_FUNCTION_STYLE_CASTSC26475 NO_FUNCTION_STYLE_CASTS

« N’utilisez pas de style de la fonction C-casts. »"Do not use function style C-casts."

Instructions de base C++: ES.49 : Si vous devez utiliser un cast, utilisez un cast nomméC++ Core Guidelines: ES.49: If you must use a cast, use a named cast

Casts de style fonction (par exemple, « int(1.1)") sont une autre version de casts de style C (par exemple, « (int) 1.1 ») avec tous les sa sécurité douteuse.Function style casts (e.g. "int(1.1)") are another incarnation of C-style casts (like "(int)1.1") with all its questionable safety. Plus précisément, compilateur ne tente pas vérifier si la perte de données peut se produire dans les conversions de C, ni dans les conversions de fonction.Specifically, compiler doesn’t try to check if any data loss can occur neither in C-casts, nor in function casts. Dans les deux cas, il est préférable éviter la conversion ou utiliser des initialiseurs d’accolade si possible.In both cases it is better either to avoid casting or use brace initializer if possible. Si ni fonctionne, les casts statiques ne peuvent être appropriés, mais il est toujours préférable d’utiliser les utilitaires de la bibliothèque de prise en charge les instructions :If neither works, static casts may be suitable, but it is still better to use utilities from the Guidelines Support Library:

  • GSL::Narrow garantit la conversion sans perte et provoque le blocage de l’exécution s’il n’est pas possible.gsl::narrow ensures lossless conversion and causes runtime crash if it is not possible.
  • GSL::narrow_cast indique clairement que la conversion peut perdre des données et il est acceptable.gsl::narrow_cast clearly states that conversion can lose data and it is acceptable.

NotesRemarks

  • Cette règle se déclenche uniquement pour les constantes des types primitifs, voici les cas où compilateur clairement détecte une perte de données et émet l’erreur si une accolade initialiseur est utilisé.This rule fires only for constants of primitive types - these are the cases where compiler can clearly detect data loss and emit error if brace initializer is used. Les cas qui nécessitent l’exécution du runtime sont marqués par C26493 NO_CSTYLE_CAST.The cases which would require runtime execution are flagged by C26493 NO_CSTYLE_CAST.
    • Initialiseurs par défaut ne sont pas marqués (par exemple, « int()").Default initializers are not flagged (e.g. "int()"). ## ExempleExample conversion dangereusedangerous conversion
constexpr auto planck_constant = float( 6.62607004082e-34 ); // C26475
## Example
dangerous conversion – detecting potential data loss
constexpr auto planck_constant = float{ 6.62607004082e-34 }; // Error C2397
## Example
dangerous conversion – corrected
constexpr auto planck_constant = double{ 6.62607004082e-34 };