Вот небольшая быстрая и грязная программа для изучения пределов system_clock
time_point
с разной точностью:
#include <chrono>
#include <iostream>
using days = std::chrono::duration
<int, std::ratio_multiply<std::ratio<24>, std::chrono::hours::period>>;
using years = std::chrono::duration
<double, std::ratio_multiply<std::ratio<146097, 400>, days::period>>;
template <class Rep, class Period>
void
max_limit(std::chrono::duration<Rep, Period> d)
{
std::cout << "[" << Period::num << '/' << Period::den << "] ";
std::cout << years{d.max()}.count() + 1970 << '\n';
}
int
main()
{
using namespace std;
using namespace std::chrono;
max_limit(nanoseconds{});
max_limit(microseconds{});
max_limit(milliseconds{});
max_limit(seconds{});
}
Это выведет год (в плавающей запятой), в котором time_point<system_clock, D>
будет максимально для любой продолжительности D
. Эта программа выводит:
[1/1000000000] 2262.28
[1/1000000] 294247
[1/1000] 2.92279e+08
[1/1] 2.92277e+11
Значение system_clock
основано на переполнении в наносекундах в 2262 году. Если вы огрубите это до микросекунд, вы переполнитесь в 294 247 году. И так далее.
Как только вы укрупняетесь до секунд, максимум выходит в нелепый диапазон. Но когда вы конвертируете это обратно в system_clock::time_point
, что по крайней мере так же точно, как микросекунды, и, возможно, так же точно, как наносекунды (в зависимости от вашей платформы), вы просто выбиваете его из воды.
Для решения вашей проблемы рекомендую:
auto M = system_clock::time_point::max();
person
Howard Hinnant
schedule
28.09.2016