请勿使用函数样式 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 };