Udostępnij przez


Ostrzeżenie C26475

Nie używaj rzutów C stylu funkcji.

Podstawowe wytyczne języka C++: ES.49: Jeśli musisz użyć rzutowania, użyj nazwanego rzutowania

Rzutowania w stylu funkcji (na przykład int(1.1)) to inna forma rzutów w stylu C (na przykład (int)1.1), które mają wątpliwe bezpieczeństwo. W szczególności kompilator nie próbuje sprawdzić, czy jakakolwiek utrata danych może wystąpić w rzutach C lub w rzutach funkcji. W obu przypadkach lepiej jest unikać rzutowania lub używać nawiasu klamrowego, jeśli jest to możliwe. Jeśli żadna z nich nie działa, rzutowania statyczne mogą być odpowiednie, ale nadal lepiej jest używać narzędzi z biblioteki pomocy technicznej wytycznych:

  • gsl::narrow zapewnia konwersję bez strat i zgłasza, gsl::narrowing_error jeśli nie jest to możliwe.
  • gsl::narrow_cast wyraźnie stwierdza, że konwersja może utracić dane i jest akceptowalna.

Uwagi

  • Ta reguła jest uruchamiana tylko dla stałych typów pierwotnych. Kompilator może wyraźnie wykryć utratę danych w tych przypadkach i emituje błąd, jeśli jest używany inicjator nawiasu klamrowego. Przypadki, które wymagają wykonania w czasie wykonywania, są oflagowane przez C26493 NO_CSTYLE_CAST.

  • Domyślne inicjatory nie są oflagowane (na przykład int()).

Przykład

Przykład niebezpiecznej konwersji:

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

Błąd kompilatora pod kątem niebezpiecznej konwersji, wykrywania potencjalnej utraty danych:

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

Aby poprawić niebezpieczną konwersję, użyj odpowiedniego typu pierwotnego o odpowiednim rozmiarze:

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