c++oding="utf-8" ?>
std::chrono::abs仅支持duration类型,不支持time_point;需确保两time_point属同一时钟(如steady_clock),相减得duration后方可调用abs。

std::chrono::abs 不能直接用于 time_point
你写 std::chrono::abs(tp1 - tp2) 编译失败?没错,std::chrono::abs 只接受 duration 类型,不接受 time_point。两个 time_point 相减的结果是 duration,但必须确保减法本身合法——即它们属于同一时钟(比如都是 steady_clock::time_point)。否则会触发 SFINAE 失败或编译错误。
常见误用:
- 混用 system_clock::time_point 和 steady_clock::time_point
- 忘记包含 <chrono></chrono>(C++17 起 std::chrono::abs 才被引入)
- 检查类型:用
decltype(tp1 - tp2)静态断言是否为 duration - 统一时钟:优先全用
std::chrono::steady_clock做性能测量 - C++14 项目?别用
std::chrono::abs,改用三元表达式:(dur >= dur.zero()) ? dur : -dur
正确调用 std::chrono::abs 的典型写法
只要确保操作对象是 duration,std::chrono::abs 就能工作。例如:
#include <chrono>
#include <iostream><p>int main() {
auto t1 = std::chrono::steady_clock::now();
// ... some work ...
auto t2 = std::chrono::steady_clock::now();</p>
<pre class="brush:php;toolbar:false;">auto diff = t2 - t1; // duration
auto abs_diff = std::chrono::abs(diff); // ✅ OK
std::cout <p>}</p>
注意:std::chrono::abs 返回的类型和输入 duration 完全一致(保留精度和周期),不会自动转成 nanoseconds 或其他单位。
- 它不改变底层
rep类型,负值取反后仍是同类型整数/浮点数 - 对浮点
duration(如std::chrono::duration<double std::milli></double>)同样适用 - 不要对
time_point本身调用abs——没有意义,也没有定义
替代方案:为什么有时不该用 abs
多数时间差场景其实不需要绝对值。比如测延迟、统计耗时,t2 - t1 天然非负(只要 t2 确实在 t1 之后)。强行加 abs 可能掩盖逻辑 bug:
- 若
t1 > t2却没报错,可能是时钟被系统调整过(system_clock不单调) - 在跨线程或异步回调中,时间戳顺序错乱说明存在竞态,abs 只是把问题藏起来
- 某些嵌入式平台或旧 STL 实现(如 libstdc++ 早于 7.1)未完全支持
std::chrono::abs
更稳健的做法是先断言顺序:assert(t2 >= t1),或用 std::max(t1, t2) - std::min(t1, t2)(适用于同钟)。
Windows + MSVC 下的兼容性坑
MSVC 2019(16.8+)开始才完整支持 C++17 的 std::chrono::abs;早期版本即使开了 /std:c++17,也可能链接时报错 undefined reference to 'std::chrono::abs(...)' 。
临时绕过方法:
- 升级工具链,或启用
/Zc:__cplusplus - 手动实现(仅限整数 rep):
template<class rep class period> constexpr std::chrono::duration<rep period> my_abs(std::chrono::duration<rep period> d) { return d >= d.zero() ? d : -d; }</rep></rep></class> - 避免依赖:直接用
(diff
真正容易被忽略的是:std::chrono::abs 对 duration 的 rep 类型有要求——它必须支持一元负号且可比较。自定义 rep 若没重载 operator- 或 operator>=,照样编译不过。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











