请勿将 static_cast 用于算术转换。 使用大括号初始化
gsl::narrow_cast
或gsl::narrow
。
C++ Core Guidelines:Type.1:避免强制转换
此规则有助于查找使用静态强制转换在整型类型之间进行转换的位置。 这些强制转换不安全,因为编译器不会在发生任何数据丢失时发出警告。 大括号初始值设定项更适合使用常量且会出现编译器错误的情况。 此外,指南支持库中的实用程序有助于明确描述意图:
gsl::narrow
可确保无损失转换,并在无法转换时引发gsl::narrowing_error
。gsl::narrow_cast
可明确指出转换可能会丢失数据并且这是可接受的。
备注
- 此规则仅针对静态强制转换实现。 建议不要使用 C 样式强制转换。
代码分析名称:NO_CASTS_FOR_ARITHMETIC_CONVERSION
示例
未经处理的意外数据:
rgb from_24bit(std::uint32_t v) noexcept {
return {
static_cast<std::uint8_t>(v >> 16), // C26472, what if top byte is non-zero?
static_cast<std::uint8_t>((v >> 8) & 0xFF), // C26472
static_cast<std::uint8_t>(v & 0xFF) // C26472
};
}
未经处理的意外数据 - 更安全的版本:
rgb from_24bit(std::uint32_t v) noexcept {
return {
gsl::narrow<std::uint8_t>(v >> 16),
gsl::narrow_cast<std::uint8_t>((v >> 8) & 0xFF),
gsl::narrow_cast<std::uint8_t>(v & 0xFF)
};
}