不要使用静态转换进行算术转换(cpp-core-guidelines)

Don't use static cast for arithmetic conversions (cpp-core-guidelines)

msvc 的 cpp 核心指南代码分析器告诉我

Warning C26472 Don't use a static_cast for arithmetic conversions. Use brace initialization, gsl::narrow_cast or gsl::narrow (type.1).

对于这个片段

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

为什么我不应该在这里使用 static_cast?

此外,如果使用大括号初始化,这将如下所示

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

在我看来,这看起来也好不到哪儿去。这看起来更像是函数样式转换。

我不能使用 gsl,我认为 gsl::narrowstatic_cast 本身的包装器,所以这纯粹是一个可读性问题吗?

so is this purely a readability issue here?

没有。大括号初始化禁止缩小转换,并会导致诊断。该指南的目的是帮助保护代码免受意外缩小。 static_cast 将允许通过静默进行缩小转换。

您似乎在处理整数,因此如果不使用大于 unsigned long long 的扩展整数类型,您可能不会遇到任何缩小问题。

但指南适用于一般情况,最好始终如一地编写代码,即使没有实际风险。

这里是 link Microsoft 文档:

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

  • gsl::narrow ensures lossless conversion and causes run-time crash if it is not possible.
  • gsl::narrow_cast clearly states that conversion can lose data and it is acceptable.

static_cast 不执行这些检查,因此明确说明您的意图更安全。