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
本身的包装器,所以这纯粹是可读性问题吗?
那么这里纯粹是可读性问题吗?
没有。 大括号初始化禁止缩小转换范围,并将导致诊断。 该准则的目的是帮助保护代码不受意外缩小的影响。 static_cast
将允许静默进行窄化转换。
如果要处理整数,那么如果不使用大于unsigned long long
的扩展整数类型,您可能不会遇到任何缩小。
但是一般情况下的指导原则是存在的,即使在没有实际风险的情况下,也最好始终如一地编写代码。
以下是指向Microsoft文档的链接:
[https://docs.microsoft.com/en-us/cpp/code-quality/c26472?view=VS-2019][1]
static_cast不执行这些检查,因此显式地陈述您的意图更为安全。