提问者:小点点

不要将静态强制转换用于算术转换(cpp-core-guidelies)


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

警告C26472不要将static_cast用于算术转换。 使用大括号初始化,gsl::narrow_cast或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::narrow是围绕static_cast本身的包装器,所以这纯粹是可读性问题吗?


共2个答案

匿名用户

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

没有。 大括号初始化禁止缩小转换范围,并将导致诊断。 该准则的目的是帮助保护代码不受意外缩小的影响。 static_cast将允许静默进行窄化转换。

如果要处理整数,那么如果不使用大于unsigned long long的扩展整数类型,您可能不会遇到任何缩小。

但是一般情况下的指导原则是存在的,即使在没有实际风险的情况下,也最好始终如一地编写代码。

匿名用户

以下是指向Microsoft文档的链接:

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

  • gsl::narrow确保无损转换,如果不可能,则会导致运行时崩溃。
  • gsl::narrow_cast清楚地说明转换可能会丢失数据,这是可以接受的。

static_cast不执行这些检查,因此显式地陈述您的意图更为安全。