Upozornění C26475
Nepoužívejte přetypování ve stylu funkce C.
C++ Core Guidelines: ES.49: Pokud je nutné použít přetypování, použijte pojmenované přetypování.
Přetypování ve stylu funkce (například int(1.1)
) jsou další formou přetypování ve stylu jazyka C (například (int)1.1
), které mají pochybnou bezpečnost. Konkrétně se kompilátor nepokouší zkontrolovat, jestli může dojít ke ztrátě dat buď v přetypování jazyka C, nebo v přetypování funkcí. V oboupřípadechch Pokud ani jedno nefunguje, může být statické přetypování vhodné, ale přesto je lepší používat nástroje z knihovny podpory pokynů:
gsl::narrow
zajišťuje bezeztrátový převod a vyvolágsl::narrowing_error
, pokud to není možné.gsl::narrow_cast
jasně uvádí, že převod může ztratit data a je přijatelný.
Poznámky
Toto pravidlo se aktivuje pouze pro konstanty primitivních typů. Kompilátor může v těchto případech jasně rozpoznat ztrátu dat a v případě použití inicializátoru složených závorek vygeneruje chybu. Případy, které by vyžadovaly provádění za běhu, jsou označeny C26493 NO_CSTYLE_CAST.
Výchozí inicializátory nejsou označeny příznakem (například
int()
).
Příklad
Příklad nebezpečného převodu:
constexpr auto planck_constant = float( 6.62607004082e-34 ); // C26475
Chyba kompilátoru při nebezpečném převodu a zjišťování potenciální ztráty dat:
constexpr auto planck_constant = float{ 6.62607004082e-34 }; // Error C2397
Chcete-li opravit nebezpečný převod, použijte odpovídající primitivní typ velikosti:
constexpr auto planck_constant = double{ 6.62607004082e-34 };