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