glibc
system_clock::duration
использует chrono::nanoseconds
для сохранения момента времени. chrono::nanoseconds
- это int64_t
.
Поскольку:
253402210800 seconds = 253402210800000000000 nanoseconds
INT64_MAX = 922337203685477580
вычисление переполняется на glib c.
Не знаю см. все ограничения на system_clock::rep
в стандартном проекте , за исключением того, что он должен быть подписан.
Какой тип переполнения я запускаю здесь?
Подписанное переполнение происходит внутри system_clock::from_time_t(time_tee);
, когда 253402210800
умножается на 1000000000
при приведении time_t
к system_clock::duration
внутри time_point_cast<system_clock::duration>
. Я думаю, что это будет точно внутри __duration_cast_impl
.
Я думаю, вы должны защитить от переполнения с помощью чека, например:
static_assert(
std::chrono::duration_cast<std::chrono::seconds>
(std::chrono::system_clock::duration::max()).count() > 253402210800
);