Condividi tramite


Avviso C26475

Non usare cast C in stile funzione.

Linee guida di base di C++: ES.49: se è necessario usare un cast, usare un cast denominato

I cast in stile funzione (ad esempio , int(1.1)) sono un'altra forma di cast in stile C (ad esempio (int)1.1), che hanno sicurezza discutibile. In particolare, il compilatore non tenta di verificare se è possibile che si verifichi una perdita di dati nei cast C o nei cast di funzioni. In entrambi i casi, è preferibile evitare il cast o usare un inizializzatore con parentesi graffa, se possibile. Se nessuno dei due funziona, i cast statici possono essere adatti, ma è comunque preferibile usare le utilità della libreria di supporto linee guida:

  • gsl::narrow garantisce la conversione senza perdita e genera gsl::narrowing_error un'eccezione se non è possibile.
  • gsl::narrow_cast chiaramente indica che la conversione può perdere dati ed è accettabile.

Osservazioni:

  • Questa regola viene attivata solo per le costanti di tipi primitivi. Il compilatore può rilevare chiaramente la perdita di dati in questi casi e genera un errore se viene usato un inizializzatore con parentesi graffa. I casi che richiedono l'esecuzione in fase di esecuzione vengono contrassegnati da NO_CSTYLE_CAST C26493.

  • Gli inizializzatori predefiniti non vengono contrassegnati ,ad esempio int().

Esempio

Esempio di conversione pericolosa:

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

Errore del compilatore per la conversione pericolosa, rilevando potenziali perdite di dati:

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

Per correggere la conversione pericolosa, usare un tipo primitivo di dimensioni appropriate:

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