abseil-upgrade-duration-conversions¶
查找对 absl::Duration
算术运算符和工厂函数的调用,这些调用需要显式类型转换才能在即将发布的 API 更改后继续编译。
absl::Duration
的运算符 *=
、/=
、*
和 /
目前接受可转换为算术类型的类类型参数。此类调用目前会将值转换为 int64_t
,即使在 std::atomic<float>
这样的情况下会导致精度损失。
此外,absl::Duration
工厂函数(absl::Hours
、absl::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
的强制转换,以保留用户代码的当前行为。这可能会暴露由于类型可以隐式转换为浮点类型而导致的意外行为。