警告 C26475

请勿使用函数样式 C-casts。

C++ 核心准则:ES.49:如果必须使用强制转换,请使用命名强制转换

函数样式强制转换(例如,int(1.1))是另一种形式的 C 样式强制转换(如 (int)1.1),其安全性值得怀疑。 具体而言,编译器不会尝试检查 C 强制转换或函数强制转换中是否会发生任何数据丢失。 在这两种情况下,如果可能的话,最好是避免转换或使用带括号的初始化表达式。 如果两者都不适用,静态强制转换可能是合适的,但最好还是使用准则支持库中的实用工具:

  • gsl::narrow 可确保无损失转换,并在无法转换时引发 gsl::narrowing_error
  • gsl::narrow_cast 可明确指出转换可能会丢失数据并且这是可接受的。

备注

  • 此规则仅针对基元类型的常数触发。 编译器可以清楚地检测到这些情况下的数据丢失,如果使用带括号的初始化表达式,则会发出错误。 需要运行时执行的情况由 C26493 NO_CSTYLE_CAST 标记。

  • 默认初始化表达式不会进行标记(例如 int())。

示例

危险的转换示例:

constexpr auto planck_constant = float( 6.62607004082e-34 ); // C26475

危险的转换的编译器错误,检测潜在的数据丢失:

constexpr auto planck_constant = float{ 6.62607004082e-34 }; // Error C2397

若要更正危险的转换,请使用适当大小的基元类型:

constexpr auto planck_constant = double{ 6.62607004082e-34 };