C++ Don';t在算术转换中使用静态转换(cpp核心指南)

C++ Don';t在算术转换中使用静态转换(cpp核心指南),c++,cpp-core-guidelines,C++,Cpp Core Guidelines,msvc的cpp核心指南代码分析器告诉我 警告C26472不要对算术转换使用静态_转换。使用 大括号初始化,gsl::窄\u cast或gsl::窄 (第1类) 对于这个片段 static_cast<IntType>(static_cast<unsigned long long>(hexValue(digit)) << (digitIdx * 4)); static_cast(静态_cast(十六进制值(数字)) 那么这纯粹是一个可读性问题吗 不。大括号初始

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

警告C26472不要对算术转换使用静态_转换。使用 大括号初始化,gsl::窄\u cast或gsl::窄 (第1类)

对于这个片段

static_cast<IntType>(static_cast<unsigned long long>(hexValue(digit)) << (digitIdx * 4));
static_cast(静态_cast(十六进制值(数字))
那么这纯粹是一个可读性问题吗

不。大括号初始化禁止缩小转换,并将导致诊断。该指南的目的是帮助保护代码不受意外缩小的影响。
static\u cast
将允许通过静默方式缩小转换

您似乎在处理整数,如果不使用大于
unsigned long long
的扩展整数类型,您可能不会遇到任何变窄


但一般情况下都有指导原则,即使没有实际风险,编写代码也最好保持一致。

这里是指向Microsoft文档的链接:

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

  • gsl::窄带确保了无损转换,如果不可能,则会导致运行时崩溃
  • gsl::窄带_cast明确指出,转换可能会丢失数据,这是可以接受的

static\u cast
不会执行这些检查,因此更安全的做法是明确说明您的意图。

IntType
是一个模板,因此左侧几乎总是会出现狭窄的
static\u cast
不会出现(即
IntType!=unsigned long long)
?@Timo-啊,你是对的。我承认我一直在关注内部静态投射。是的,你是对的,这通常会导致狭窄。
gsl::狭窄投射
在这种情况下存在。它使狭窄的可能性突出(这就是为什么诊断被沉默的原因)。如果无法使用,则只能使用
static\u cast
。在本地禁用警告,如果无法拉入
gsl
,则可能会添加注释。
IntType{unsigned long long{hexValue(digit)} << (digitIdx * 4)};