Partager via


Avertissement C26475

N’utilisez pas de casts C de style de fonction.

Instructions principales C++ : ES.49 : Si vous devez utiliser un cast, utilisez un cast nommé

Les casts de style de fonction (par exemple) int(1.1)sont une autre forme de casts de style C (comme (int)1.1), qui ont une sécurité douteuse. Plus précisément, le compilateur n’essaie pas de case activée si une perte de données peut se produire dans des casts C ou dans des casts de fonction. Dans les deux cas, il est préférable d’éviter le cast ou d’utiliser un initialiseur accoladé si possible. Si aucun des deux fonctionne, les casts statiques peuvent convenir, mais il est toujours préférable d’utiliser les utilitaires de la bibliothèque de prise en charge des instructions :

  • gsl::narrow garantit la conversion sans perte et lève si gsl::narrowing_error ce n’est pas possible.
  • gsl::narrow_cast indique clairement que la conversion peut perdre des données et qu’elle est acceptable.

Notes

  • Cette règle se déclenche uniquement pour les constantes des types primitifs. Le compilateur peut détecter clairement la perte de données dans ces cas et émettre une erreur si un initialiseur accoladé est utilisé. Les cas qui nécessitent une exécution au moment de l’exécution sont marqués par la NO_CSTYLE_CAST C26493.

  • Les initialiseurs par défaut ne sont pas marqués (par exemple int()).

Exemple

Exemple de conversion dangereux :

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

Erreur du compilateur pour la conversion dangereuse, détection de la perte de données potentielle :

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

Pour corriger la conversion dangereuse, utilisez un type primitif de taille appropriée :

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