不要使用静态转换进行算术转换(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::narrow
是 static_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
不执行这些检查,因此明确说明您的意图更安全。
msvc 的 cpp 核心指南代码分析器告诉我
Warning C26472 Don't use a
static_cast
for arithmetic conversions. Use brace initialization,gsl::narrow_cast
orgsl::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
本身的包装器,所以这纯粹是一个可读性问题吗?
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
不执行这些检查,因此明确说明您的意图更安全。