Не используйте stati c cast для арифметических c преобразований (cpp -core-guidelines) - PullRequest
2 голосов
/ 16 июня 2020
Анализатор кода

msv c для основных рекомендаций cpp сообщает мне

Предупреждение C26472 Не используйте static_cast для преобразований арифметических c. Используйте инициализацию скобок, gsl :: thin_cast или gsl :: thin (type.1).

для этого фрагмента

static_cast<IntType>(static_cast<unsigned long long>(hexValue(digit)) << (digitIdx * 4));

Почему мне не следует использовать здесь static_cast?

Кроме того, с фигурной скобкой init это будет выглядеть так

IntType{unsigned long long{hexValue(digit)} << (digitIdx * 4)};

, что не выглядит лучше imo. Это больше похоже на приведение стиля функции, чем на что-либо еще.

Я не могу использовать gsl и думаю, что gsl::narrow - это оболочка вокруг самого static_cast, так что это чисто проблема с удобочитаемостью?

Ответы [ 2 ]

3 голосов
/ 16 июня 2020

так это чисто проблема читабельности?

Нет. Инициализация скобок запрещает сужающие преобразования и вызовет диагностику c. Цель руководства - помочь защитить код от непреднамеренного сужения. A static_cast позволит сужающее преобразование беззвучно.

Вы видите, что имеете дело с целыми числами, поэтому, если не использовать расширенный целочисленный тип, который больше unsigned long long, вы, вероятно, не столкнетесь с каким-либо сужением .

Но руководство есть для общего случая, и лучше писать код последовательно, даже когда нет реального риска.

2 голосов
/ 16 июня 2020

Вот ссылка на документацию Microsoft:

[https://docs.microsoft.com/en-us/cpp/code-quality/c26472?view=vs-2019] [1]

  • gsl :: slim обеспечивает преобразование без потерь и вызывает ошибку во время выполнения sh, если это невозможно.
  • gsl :: thin_cast четко указывает, что преобразование может привести к потере данных, и это приемлемо.

static_cast не выполняет эти проверки, поэтому безопаснее явно заявить о своих намерениях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...