Поделиться через


Предупреждение C26475

Не используйте стиль функции C-casts.

Основные рекомендации по C++ : ES.49: если необходимо использовать приведение, используйте именованный приведение.

Приведения в стиле функций (например, int(1.1)) — это другая форма приведения стилей C (например (int)1.1, которые имеют сомнительные меры безопасности). В частности, компилятор не пытается проверить, может ли какая-либо потеря данных возникать в приведениях C или в приведениях функций. В обоих случаях лучше либо избежать приведения, либо использовать фигурный инициализатор, если это возможно. Если ничего не работает, статические приведения могут быть подходящими, но все еще лучше использовать служебные программы из библиотеки поддержки рекомендаций:

  • gsl::narrow гарантирует, что преобразование без потери и вызывается gsl::narrowing_error , если это невозможно.
  • gsl::narrow_cast ясно указывает, что преобразование может потерять данные и это приемлемо.

Замечания

  • Это правило запускается только для констант примитивных типов. Компилятор может четко обнаружить потерю данных в этих случаях и выдает ошибку, если используется инициализатор с фигурной скобкой. Случаи, требующие выполнения во время выполнения, помечены NO_CSTYLE_CAST C26493.

  • Инициализаторы по умолчанию не помечены (например int()).

Пример

Пример опасного преобразования:

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

Ошибка компилятора для опасного преобразования, обнаруживая потенциальную потерю данных:

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

Чтобы исправить опасное преобразование, используйте соответствующий примитивный тип:

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