c++ - 为什么system_clock time_point不能从duration构造?

标签 c++ c++20 chrono

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

constexpr explicit time_point( const duration& d );
  1. Constructs a time_point at Clock's epoch plus d.

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

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

更令人惊讶的是,它似乎依赖于 std lib 实现,因为 clang 与 libc++ 一起工作。

#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 上找不到这个问题的答案,如果没有人有兴趣回答,我会回答这个问题。

最佳答案

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))); };
}

关于c++ - 为什么system_clock time_point不能从duration构造?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67433342/

相关文章:

c++ - 此代码行为是否已定义?

c++ - 迭代器实际上指向容器中的什么?

c++ - 查找全局变量而不是在 C++ 函数中构造它们

c++ - 将此时间字符串解析为 'std::chrono' 有什么问题?

c++ - 以分钟为单位查找与 GMT 的本地时区差异

c++ - 是否可以在部分特化中模拟默认模板参数?

c++ - 成员函数指针的类型推导

c++ - 为什么 `std::uninitialized_copy/move etc.` 不是 constexpr?

json - 无法从json反序列化chrono::DateTime

C++20 概念要求运算符重载结合用户定义模板运算符重载函数