为什么system_clocktime_point不能从duration构造?
Why system_clock time_point can not be constructed from duration?
浏览 cppreference 表明理论上任何 time_point
都应该可以从持续时间构造。
constexpr explicit time_point( const duration& d );
- 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_clock
和 steady_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))); };
}
浏览 cppreference 表明理论上任何 time_point
都应该可以从持续时间构造。
constexpr explicit time_point( const duration& d );
- 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_clock
和 steady_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))); };
}