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

Tim*_*imo 5 c++ cpp-core-guidelines

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

警告 C26472 不要使用 astatic_cast进行算术转换。使用大括号初始化,gsl::narrow_castgsl::narrow (type.1)。

对于这个片段

static_cast<IntType>(static_cast<unsigned long long>(hexValue(digit)) << (digitIdx * 4));
Run Code Online (Sandbox Code Playgroud)

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

另外,使用大括号初始化,这看起来像这样

IntType{unsigned long long{hexValue(digit)} << (digitIdx * 4)};
Run Code Online (Sandbox Code Playgroud)

我认为这看起来并没有更好。这看起来更像是函数风格的转换而不是其他任何东西。

我无法使用 gsl 并且我认为gsl::narrow它是自身的包装器static_cast,所以这纯粹是一个可读性问题吗?

Sto*_*ica 5

那么这纯粹是一个可读性问题吗?

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

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

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