【问题标题】:Why system_clock time_point can not be constructed from duration?为什么 system_clock time_point 不能从持续时间构造?
【发布时间】:2021-07-29 16:00:52
【问题描述】:

浏览 cppreference 表明理论上任何time_point 都应该可以从持续时间构造。

constexpr explicit time_point( const duration& d );
  1. 在时钟的纪元加上 d 构造一个 time_point。

但是当我在some compilers it does not work, on some it works 上尝试时。

第二个 lambda 不起作用,但令人惊讶的是第一个可以。

更令人惊讶的是,它似乎依赖于 std lib 实现,因为使用 libc++ 的 clang 可以工作。

#include <chrono>
using namespace std::chrono;
int main() {
    [] { return steady_clock::time_point(seconds(1000'000'000) + nanoseconds(1)); };
    [] { return system_clock::time_point(seconds(1000'000'000) + nanoseconds(1)); };
}

注意:我知道答案,但我觉得它很有趣,所以我想分享,因为我在 SO 上没有找到答案,如果没有人有兴趣回答,我会回答这个问题。

【问题讨论】:

    标签: c++ c++20 chrono


    【解决方案1】:

    system_clocksteady_clock 的持续时间由实现定义。在没有(至少)纳秒分辨率的平台上,没有构造函数采用nanoseconds

    如果您将duration_cast 添加到适当的持续时间,那么两者都可以工作。

    #include <chrono>
    using namespace std::chrono;
    int main() {
        [] { return steady_clock::time_point(duration_cast<steady_clock::duration>(seconds(1000'000'000) + nanoseconds(1))); };
        [] { return system_clock::time_point(duration_cast<system_clock::duration>(seconds(1000'000'000) + nanoseconds(1))); };
    }
    

    【讨论】:

    • 另一种选择是在可接受的情况下只使用 micros 而不是 nanos(因为 afaik 所有 system_clocks 的精度都 > micros),但显然你会受到 micros 分辨率的限制。
    • 出于学习目的,可以说 time_points 以与持续时间相同的方式处理整数截断。因此,一旦您了解了持续时间,就无需了解更多关于 time_points 的内容了。
    • @HowardHinnant 是的,但我也希望 std 实现者提供更好的错误消息,这似乎应该是可能的......特别是因为人们声称概念使这成为可能......
    猜你喜欢
    • 2013-05-07
    • 1970-01-01
    • 1970-01-01
    • 2018-07-27
    • 1970-01-01
    • 1970-01-01
    • 2015-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多