abseil-upgrade-duration-conversions

查找对 absl::Duration 算术运算符和工厂函数的调用,这些调用需要显式类型转换才能在即将发布的 API 更改后继续编译。

absl::Duration 的运算符 *=/=*/ 目前接受可转换为算术类型的类类型参数。此类调用目前会将值转换为 int64_t,即使在 std::atomic<float> 这样的情况下会导致精度损失。

此外,absl::Duration 工厂函数(absl::Hoursabsl::Minutes 等)目前接受 int64_t 或浮点类型。与算术运算符类似,带有可转换为算术类型的类类型参数的调用会通过 int64_t 路径进行。

这些运算符和工厂函数将更改为仅接受算术类型,以防止意外行为。这些更改发布后,传递类类型参数将不再编译,即使类型可以隐式转换为算术类型。

以下是此检查创建的示例修复程序

std::atomic<int> a;
absl::Duration d = absl::Milliseconds(a);
d *= a;

变为

std::atomic<int> a;
absl::Duration d = absl::Milliseconds(static_cast<int64_t>(a));
d *= static_cast<int64_t>(a);

请注意,此检查始终添加转换为 int64_t 的强制转换,以保留用户代码的当前行为。这可能会暴露由于类型可以隐式转换为浮点类型而导致的意外行为。