В этом подпункте описываются chrono library и различные, C functions которые предоставляют обычно полезные утилиты времени.
namespace std { namespace chrono { // [time.duration], class template duration template <class Rep, class Period = ratio<1>> class duration; // [time.point], class template time_point template <class Clock, class Duration = typename Clock::duration> class time_point; } // [time.traits.specializations], common_type specializations template <class Rep1, class Period1, class Rep2, class Period2> struct common_type<chrono::duration<Rep1, Period1>, chrono::duration<Rep2, Period2>>; template <class Clock, class Duration1, class Duration2> struct common_type<chrono::time_point<Clock, Duration1>, chrono::time_point<Clock, Duration2>>; namespace chrono { // [time.traits], customization traits template <class Rep> struct treat_as_floating_point; template <class Rep> struct duration_values; template <class Rep> inline constexpr bool treat_as_floating_point_v = treat_as_floating_point<Rep>::value; // [time.duration.nonmember], duration arithmetic template <class Rep1, class Period1, class Rep2, class Period2> common_type_t<duration<Rep1, Period1>, duration<Rep2, Period2>> constexpr operator+(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs); template <class Rep1, class Period1, class Rep2, class Period2> common_type_t<duration<Rep1, Period1>, duration<Rep2, Period2>> constexpr operator-(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs); template <class Rep1, class Period, class Rep2> duration<common_type_t<Rep1, Rep2>, Period> constexpr operator*(const duration<Rep1, Period>& d, const Rep2& s); template <class Rep1, class Rep2, class Period> duration<common_type_t<Rep1, Rep2>, Period> constexpr operator*(const Rep1& s, const duration<Rep2, Period>& d); template <class Rep1, class Period, class Rep2> duration<common_type_t<Rep1, Rep2>, Period> constexpr operator/(const duration<Rep1, Period>& d, const Rep2& s); template <class Rep1, class Period1, class Rep2, class Period2> common_type_t<Rep1, Rep2> constexpr operator/(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs); template <class Rep1, class Period, class Rep2> duration<common_type_t<Rep1, Rep2>, Period> constexpr operator%(const duration<Rep1, Period>& d, const Rep2& s); template <class Rep1, class Period1, class Rep2, class Period2> common_type_t<duration<Rep1, Period1>, duration<Rep2, Period2>> constexpr operator%(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs); // [time.duration.comparisons], duration comparisons template <class Rep1, class Period1, class Rep2, class Period2> constexpr bool operator==(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs); template <class Rep1, class Period1, class Rep2, class Period2> constexpr bool operator!=(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs); template <class Rep1, class Period1, class Rep2, class Period2> constexpr bool operator< (const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs); template <class Rep1, class Period1, class Rep2, class Period2> constexpr bool operator<=(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs); template <class Rep1, class Period1, class Rep2, class Period2> constexpr bool operator> (const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs); template <class Rep1, class Period1, class Rep2, class Period2> constexpr bool operator>=(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs); // [time.duration.cast], duration_cast template <class ToDuration, class Rep, class Period> constexpr ToDuration duration_cast(const duration<Rep, Period>& d); template <class ToDuration, class Rep, class Period> constexpr ToDuration floor(const duration<Rep, Period>& d); template <class ToDuration, class Rep, class Period> constexpr ToDuration ceil(const duration<Rep, Period>& d); template <class ToDuration, class Rep, class Period> constexpr ToDuration round(const duration<Rep, Period>& d); // convenience typedefs using nanoseconds = duration<signed integer type of at least 64 bits, nano>; using microseconds = duration<signed integer type of at least 55 bits, micro>; using milliseconds = duration<signed integer type of at least 45 bits, milli>; using seconds = duration<signed integer type of at least 35 bits>; using minutes = duration<signed integer type of at least 29 bits, ratio< 60>>; using hours = duration<signed integer type of at least 23 bits, ratio<3600>>; // [time.point.nonmember], time_point arithmetic template <class Clock, class Duration1, class Rep2, class Period2> constexpr time_point<Clock, common_type_t<Duration1, duration<Rep2, Period2>>> operator+(const time_point<Clock, Duration1>& lhs, const duration<Rep2, Period2>& rhs); template <class Rep1, class Period1, class Clock, class Duration2> constexpr time_point<Clock, common_type_t<duration<Rep1, Period1>, Duration2>> operator+(const duration<Rep1, Period1>& lhs, const time_point<Clock, Duration2>& rhs); template <class Clock, class Duration1, class Rep2, class Period2> constexpr time_point<Clock, common_type_t<Duration1, duration<Rep2, Period2>>> operator-(const time_point<Clock, Duration1>& lhs, const duration<Rep2, Period2>& rhs); template <class Clock, class Duration1, class Duration2> constexpr common_type_t<Duration1, Duration2> operator-(const time_point<Clock, Duration1>& lhs, const time_point<Clock, Duration2>& rhs); // [time.point.comparisons], time_point comparisons template <class Clock, class Duration1, class Duration2> constexpr bool operator==(const time_point<Clock, Duration1>& lhs, const time_point<Clock, Duration2>& rhs); template <class Clock, class Duration1, class Duration2> constexpr bool operator!=(const time_point<Clock, Duration1>& lhs, const time_point<Clock, Duration2>& rhs); template <class Clock, class Duration1, class Duration2> constexpr bool operator< (const time_point<Clock, Duration1>& lhs, const time_point<Clock, Duration2>& rhs); template <class Clock, class Duration1, class Duration2> constexpr bool operator<=(const time_point<Clock, Duration1>& lhs, const time_point<Clock, Duration2>& rhs); template <class Clock, class Duration1, class Duration2> constexpr bool operator> (const time_point<Clock, Duration1>& lhs, const time_point<Clock, Duration2>& rhs); template <class Clock, class Duration1, class Duration2> constexpr bool operator>=(const time_point<Clock, Duration1>& lhs, const time_point<Clock, Duration2>& rhs); // [time.point.cast], time_point_cast template <class ToDuration, class Clock, class Duration> constexpr time_point<Clock, ToDuration> time_point_cast(const time_point<Clock, Duration>& t); template <class ToDuration, class Clock, class Duration> constexpr time_point<Clock, ToDuration> floor(const time_point<Clock, Duration>& tp); template <class ToDuration, class Clock, class Duration> constexpr time_point<Clock, ToDuration> ceil(const time_point<Clock, Duration>& tp); template <class ToDuration, class Clock, class Duration> constexpr time_point<Clock, ToDuration> round(const time_point<Clock, Duration>& tp); // [time.duration.alg], specialized algorithms template <class Rep, class Period> constexpr duration<Rep, Period> abs(duration<Rep, Period> d); // [time.clock], clocks class system_clock; class steady_clock; class high_resolution_clock; } inline namespace literals { inline namespace chrono_literals { // [time.duration.literals], suffixes for duration literals constexpr chrono::hours operator""h(unsigned long long); constexpr chrono::duration<unspecified, ratio<3600,1>> operator""h(long double); constexpr chrono::minutes operator""min(unsigned long long); constexpr chrono::duration<unspecified, ratio<60,1>> operator""min(long double); constexpr chrono::seconds operator""s(unsigned long long); constexpr chrono::duration<unspecified> operator""s(long double); constexpr chrono::milliseconds operator""ms(unsigned long long); constexpr chrono::duration<unspecified, milli> operator""ms(long double); constexpr chrono::microseconds operator""us(unsigned long long); constexpr chrono::duration<unspecified, micro> operator""us(long double); constexpr chrono::nanoseconds operator""ns(unsigned long long); constexpr chrono::duration<unspecified, nano> operator""ns(long double); } } namespace chrono { using namespace literals::chrono_literals; } }
Часы - это связка, состоящая из a duration, a time_pointи функции now() для получения тока time_point. Происхождение часов time_point называется часами epoch. Часы должны соответствовать требованиям таблицы 52.
В таблице 52 C1 и цвет, C2 обозначают типы тактовых импульсов. t1 и t2 являются значениями, возвращаемыми тем C1::now() местом, где вызов возвращает возвращаемый t1 happens before вызов, t2 и оба этих вызова произошли раньше C1::time_point::max(). [ Note: Это означает, C1 что не нужно переходить между t1 и t2. ] — end note
Выражение | Тип возврата | Операционная семантика |
C1::rep | Арифметический тип или класс, имитирующий арифметический тип | Тип представления C1::duration. |
C1::period | специализация ratio | Период тика часов в секундах. |
C1::duration | chrono::duration<C1::rep, C1::period> | duration Тип часов. |
C1::time_point | chrono::time_point<C1> или chrono::time_point<C2, C1::duration> | time_point Тип часов. C1 и C2 будет относиться к той же эпохе. |
C1::is_steady | const bool | true если t1 <= t2 всегда, true а время между тактами часов постоянно, в противном случае false. |
C1::now() | C1::time_point | Возвращает time_point объект, представляющий текущий момент времени. |
[ Note: Относительная разница в продолжительности между теми, о которых сообщают данные часы и определение SI, является мерой качества реализации. ] — end note
Тип TC соответствует TrivialClock требованиям, если:
TC удовлетворяет Clock requirements,
типы TC::rep, TC::durationи TC::time_point удовлетворяют требования EqualityComparable, LessThanComparable, DefaultConstructible, CopyConstructible, CopyAssignable, Destructible, и требование о numeric types. [ Note: Это, в частности, означает, что операции с этими типами не вызывают исключений. ] — end note
lvalues этих типов TC::rep, TC::durationи TC::time_point являются swappable,
функция TC::now() не генерирует исключений и
тип TC::time_point::clock соответствует TrivialClock требованиям, рекурсивно.
template <class Rep> struct treat_as_floating_point
: is_floating_point<Rep> { };
В duration использует шаблон по treat_as_floating_point черту , чтобы помочь определить , если duration объект может быть преобразован в другой duration с другим клещом period. Если treat_as_floating_point_v<Rep> есть true, то среди durations разрешены неявные преобразования . В противном случае неявная конвертируемость зависит от отметки periods в durationстроке s. [ Note: Цель этой черты - указать, ведет ли данный класс как тип с плавающей запятой, и, таким образом, разрешает деление одного значения на другое с приемлемой потерей точности. Если treat_as_floating_point_v<Rep> есть false, Rep будет рассматриваться, как если бы он вел себя как интегральный тип для целей этих преобразований. ] — end note
template <class Rep>
struct duration_values {
public:
static constexpr Rep zero();
static constexpr Rep min();
static constexpr Rep max();
};
duration Шаблон использует duration_values признак , чтобы построить специальные значения представления длительностей (Rep). Это сделано потому, что представление может быть типом класса с поведением, которое требует, чтобы какая-то другая реализация возвращала эти специальные значения. В этом случае автор этого типа класса должен специализироваться duration_values на возврате указанных значений.
static constexpr Rep zero();
Returns: Rep(0). [ Note: Rep(0) указывается вместо, Rep() потому что Rep() может иметь другое значение, например, неинициализированное значение. ] — end note
static constexpr Rep min();
static constexpr Rep max();
template <class Rep1, class Period1, class Rep2, class Period2>
struct common_type<chrono::duration<Rep1, Period1>, chrono::duration<Rep2, Period2>> {
using type = chrono::duration<common_type_t<Rep1, Rep2>, see below>;
};
period Из duration обозначено этой специализации common_type должны быть наибольший общий делитель Period1 и Period2. [ Note: Это можно вычислить, образуя отношение наибольшего общего делителя Period1::num и Period2::num и наименьшего общего кратного Period1::den и Period2::den. ] — end note
[ Имя является синонимом для с самым большим клеща возможно , когда оба аргумента будет конвертировать в него , не требуя операции деления. Представление этого типа предназначено для того, чтобы иметь возможность хранить любое значение, полученное в результате этого преобразования, без ошибки усечения, хотя длительности с плавающей запятой могут иметь ошибки округления. ] Note: typedef type duration period duration — end note
template <class Clock, class Duration1, class Duration2>
struct common_type<chrono::time_point<Clock, Duration1>, chrono::time_point<Clock, Duration2>> {
using type = chrono::time_point<Clock, common_type_t<Duration1, Duration2>>;
};
duration Меры типа времени между двумя точками во времени (time_pointсек). A duration имеет представление, которое содержит количество тиков и период тиков. Тиковый период - это количество времени, которое происходит от одного тика до следующего, в секундах. Он выражается как рациональная константа с помощью шаблона ratio.
template <class Rep, class Period = ratio<1>> class duration { public: using rep = Rep; using period = typename Period::type; private: rep rep_; // exposition only public: // [time.duration.cons], construct/copy/destroy constexpr duration() = default; template <class Rep2> constexpr explicit duration(const Rep2& r); template <class Rep2, class Period2> constexpr duration(const duration<Rep2, Period2>& d); ~duration() = default; duration(const duration&) = default; duration& operator=(const duration&) = default; // [time.duration.observer], observer constexpr rep count() const; // [time.duration.arithmetic], arithmetic constexpr common_type_t<duration> operator+() const; constexpr common_type_t<duration> operator-() const; constexpr duration& operator++(); constexpr duration operator++(int); constexpr duration& operator--(); constexpr duration operator--(int); constexpr duration& operator+=(const duration& d); constexpr duration& operator-=(const duration& d); constexpr duration& operator*=(const rep& rhs); constexpr duration& operator/=(const rep& rhs); constexpr duration& operator%=(const rep& rhs); constexpr duration& operator%=(const duration& rhs); // [time.duration.special], special values static constexpr duration zero(); static constexpr duration min(); static constexpr duration max(); };
Rep должен быть арифметическим типом или классом, имитирующим арифметический тип. Если duration создается экземпляр с duration типом в качестве аргумента для параметра шаблона Rep, программа имеет неправильный формат.
Если Period это не специализация ratio, программа плохо сформирована. Если Period::num не положительный, программа неправильно сформирована.
Члены duration не должны бросать исключения, кроме тех, которые выбрасываются указанными операциями на их представления.
Конструктор копирования по умолчанию для duration должен быть функцией constexpr тогда и только тогда, когда требуемая инициализация члена rep_ для копирования и перемещения, соответственно, удовлетворяет требованиям для функции constexpr.
[ Example:
duration<long, ratio<60>> d0; // holds a count of minutes using a long duration<long long, milli> d1; // holds a count of milliseconds using a long long duration<double, ratio<1, 30>> d2; // holds a count with a tick period of 130 of a second // (30 Hz) using a double
— end example ]
template <class Rep2>
constexpr explicit duration(const Rep2& r);
Remarks: Этот конструктор не должен участвовать в разрешении перегрузки, если он не Rep2 может быть неявно преобразован в rep и
treat_as_floating_point_v<rep> есть true или
treat_as_floating_point_v<Rep2> есть false.
[ Example:
duration<int, milli> d(3); // OK duration<int, milli> d(3.5); // error
— end example ]
template <class Rep2, class Period2>
constexpr duration(const duration<Rep2, Period2>& d);
Remarks: Этот конструктор не должен участвовать в разрешении перегрузки, если при преобразовании не индуцируется переполнение и treat_as_floating_point_v<rep> есть true или оба они ratio_divide<Period2, period>::den есть 1 и treat_as_floating_point_v<Rep2> есть false. [ Note: Это требование предотвращает неявную ошибку усечения при преобразовании между целочисленными duration типами. Такая конструкция может легко привести к путанице в отношении стоимости duration. ] [ — end note Example:
duration<int, milli> ms(3); duration<int, micro> us = ms; // OK duration<int, milli> ms2 = us; // error
— end example ]
constexpr common_type_t<duration> operator+() const;
constexpr common_type_t<duration> operator-() const;
constexpr duration& operator++();
constexpr duration operator++(int);
constexpr duration& operator--();
constexpr duration operator--(int);
constexpr duration& operator+=(const duration& d);
constexpr duration& operator-=(const duration& d);
constexpr duration& operator*=(const rep& rhs);
constexpr duration& operator/=(const rep& rhs);
constexpr duration& operator%=(const rep& rhs);
constexpr duration& operator%=(const duration& rhs);
static constexpr duration zero();
static constexpr duration min();
static constexpr duration max();
В нижеследующих описаниях функций CD представляет тип возвращаемого значения функции. CR(A, B) представляет common_type_t<A, B>.
template <class Rep1, class Period1, class Rep2, class Period2>
constexpr common_type_t<duration<Rep1, Period1>, duration<Rep2, Period2>>
operator+(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs);
template <class Rep1, class Period1, class Rep2, class Period2>
constexpr common_type_t<duration<Rep1, Period1>, duration<Rep2, Period2>>
operator-(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs);
template <class Rep1, class Period, class Rep2>
constexpr duration<common_type_t<Rep1, Rep2>, Period>
operator*(const duration<Rep1, Period>& d, const Rep2& s);
Remarks: Этот оператор не должен участвовать в разрешении перегрузки, если он не Rep2 может быть неявно преобразован в CR(Rep1, Rep2).
template <class Rep1, class Rep2, class Period>
constexpr duration<common_type_t<Rep1, Rep2>, Period>
operator*(const Rep1& s, const duration<Rep2, Period>& d);
Remarks: Этот оператор не должен участвовать в разрешении перегрузки, если он не Rep1 может быть неявно преобразован в CR(Rep1, Rep2).
template <class Rep1, class Period, class Rep2>
constexpr duration<common_type_t<Rep1, Rep2>, Period>
operator/(const duration<Rep1, Period>& d, const Rep2& s);
Remarks: Этот оператор не должен участвовать в разрешении перегрузки , если Rep2 не неявное преобразование CR(Rep1, Rep2) и Rep2 не является специализация duration.
template <class Rep1, class Period1, class Rep2, class Period2>
constexpr common_type_t<Rep1, Rep2>
operator/(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs);
template <class Rep1, class Period, class Rep2>
constexpr duration<common_type_t<Rep1, Rep2>, Period>
operator%(const duration<Rep1, Period>& d, const Rep2& s);
Remarks: Этот оператор не должен участвовать в разрешении перегрузки , если Rep2 не неявное преобразование CR(Rep1, Rep2) и Rep2 не является специализация duration.
template <class Rep1, class Period1, class Rep2, class Period2>
constexpr common_type_t<duration<Rep1, Period1>, duration<Rep2, Period2>>
operator%(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs);
В нижеследующих описаниях функций, CT представляет common_type_t<A, B>, где A и B - типы двух аргументов функции.
template <class Rep1, class Period1, class Rep2, class Period2>
constexpr bool operator==(const duration<Rep1, Period1>& lhs,
const duration<Rep2, Period2>& rhs);
template <class Rep1, class Period1, class Rep2, class Period2>
constexpr bool operator!=(const duration<Rep1, Period1>& lhs,
const duration<Rep2, Period2>& rhs);
template <class Rep1, class Period1, class Rep2, class Period2>
constexpr bool operator<(const duration<Rep1, Period1>& lhs,
const duration<Rep2, Period2>& rhs);
template <class Rep1, class Period1, class Rep2, class Period2>
constexpr bool operator<=(const duration<Rep1, Period1>& lhs,
const duration<Rep2, Period2>& rhs);
template <class Rep1, class Period1, class Rep2, class Period2>
constexpr bool operator>(const duration<Rep1, Period1>& lhs,
const duration<Rep2, Period2>& rhs);
template <class Rep1, class Period1, class Rep2, class Period2>
constexpr bool operator>=(const duration<Rep1, Period1>& lhs,
const duration<Rep2, Period2>& rhs);
template <class ToDuration, class Rep, class Period>
constexpr ToDuration duration_cast(const duration<Rep, Period>& d);
Remarks: Эта функция не должна участвовать в разрешении перегрузки, если ToDuration она не является специализацией duration.
Returns: Да CF будет ratio_divide<Period, typename ToDuration::period>и CR будет common_type< typename ToDuration::rep, Rep, intmax_t>::type.
Если CF::num == 1 и CF::den == 1, возвращает
ToDuration(static_cast<typename ToDuration::rep>(d.count()))
в противном случае, если CF::num != 1 и CF::den == 1, возвращает
ToDuration(static_cast<typename ToDuration::rep>( static_cast<CR>(d.count()) * static_cast<CR>(CF::num)))
в противном случае, если CF::num == 1 и CF::den != 1, возвращает
ToDuration(static_cast<typename ToDuration::rep>( static_cast<CR>(d.count()) / static_cast<CR>(CF::den)))
в противном случае возвращается
ToDuration(static_cast<typename ToDuration::rep>( static_cast<CR>(d.count()) * static_cast<CR>(CF::num) / static_cast<CR>(CF::den)))
[ Note: Эта функция не использует никаких неявных преобразований; все преобразования выполняются с помощью static_cast. Он избегает умножений и делений, когда во время компиляции известно, что один или несколько аргументов равны 1. Промежуточные вычисления выполняются в самом широком представлении и преобразуются в целевое представление только на последнем шаге. ] — end note
template <class ToDuration, class Rep, class Period>
constexpr ToDuration floor(const duration<Rep, Period>& d);
Remarks: Эта функция не должна участвовать в разрешении перегрузки, если ToDuration она не является специализацией duration.
template <class ToDuration, class Rep, class Period>
constexpr ToDuration ceil(const duration<Rep, Period>& d);
Remarks: Эта функция не должна участвовать в разрешении перегрузки, если ToDuration она не является специализацией duration.
template <class ToDuration, class Rep, class Period>
constexpr ToDuration round(const duration<Rep, Period>& d);
Remarks: Эта функция не должна участвовать в разрешении перегрузки, если ToDuration она не является специализацией durationи не treat_as_floating_point_v<typename ToDuration::rep> является false.
В этом разделе описаны буквальные суффиксы для построения литералов продолжительности. Суффиксы h, min, s, ms, us, ns обозначает значение длительности соответствующих типов hours, minutes, seconds, milliseconds, microseconds, и , nanoseconds соответственно , если они применяются к интегральным литералам.
Если любой из этих суффиксов применяется к литералу с плавающей запятой, результатом будет chrono::duration литерал с неопределенным представлением с плавающей запятой.
Если любой из этих суффиксов применяется к целочисленному литералу и результирующее chrono::duration значение не может быть представлено в типе результата из-за переполнения, программа имеет неправильный формат.
[ Example: В следующем коде показаны некоторые литералы продолжительности.
using namespace std::chrono_literals; auto constexpr aday=24h; auto constexpr lesson=45min; auto constexpr halfanhour=0.5h;
— end example ]
constexpr chrono::hours operator""h(unsigned long long hours);
constexpr chrono::duration<unspecified, ratio<3600, 1>> operator""h(long double hours);
constexpr chrono::minutes operator""min(unsigned long long minutes);
constexpr chrono::duration<unspecified, ratio<60, 1>> operator""min(long double minutes);
constexpr chrono::seconds operator""s(unsigned long long sec);
constexpr chrono::duration<unspecified> operator""s(long double sec);
[ Note: Используется тот же суффикс s , basic_string но нет конфликта, поскольку суффиксы продолжительности применяются к числам, а суффиксы строковых литералов применяются к литералам символьных массивов. ] — end note
constexpr chrono::milliseconds operator""ms(unsigned long long msec);
constexpr chrono::duration<unspecified, milli> operator""ms(long double msec);
constexpr chrono::microseconds operator""us(unsigned long long usec);
constexpr chrono::duration<unspecified, micro> operator""us(long double usec);
constexpr chrono::nanoseconds operator""ns(unsigned long long nsec);
constexpr chrono::duration<unspecified, nano> operator""ns(long double nsec);
template <class Rep, class Period>
constexpr duration<Rep, Period> abs(duration<Rep, Period> d);
Remarks: Эта функция не будет участвовать в разрешении перегрузки , если numeric_limits<Rep>::is_signed не true.
template <class Clock, class Duration = typename Clock::duration> class time_point { public: using clock = Clock; using duration = Duration; using rep = typename duration::rep; using period = typename duration::period; private: duration d_; // exposition only public: // [time.point.cons], construct constexpr time_point(); // has value epoch constexpr explicit time_point(const duration& d); // same as time_point() + d template <class Duration2> constexpr time_point(const time_point<clock, Duration2>& t); // [time.point.observer], observer constexpr duration time_since_epoch() const; // [time.point.arithmetic], arithmetic constexpr time_point& operator+=(const duration& d); constexpr time_point& operator-=(const duration& d); // [time.point.special], special values static constexpr time_point min(); static constexpr time_point max(); };
constexpr time_point();
Effects: Создает объект типа time_point, инициализируясь d_ с помощью duration::zero(). Такой time_point объект представляет эпоху.
constexpr explicit time_point(const duration& d);
Effects: Создает объект типа time_point, инициализируясь d_ с помощью d. Такой time_point объект представляет эпоху + d.
template <class Duration2>
constexpr time_point(const time_point<clock, Duration2>& t);
Remarks: Этот конструктор не должен участвовать в разрешении перегрузки, если он не Duration2 может быть неявно преобразован в duration.
constexpr duration time_since_epoch() const;
constexpr time_point& operator+=(const duration& d);
constexpr time_point& operator-=(const duration& d);
static constexpr time_point min();
static constexpr time_point max();
template <class Clock, class Duration1, class Rep2, class Period2>
constexpr time_point<Clock, common_type_t<Duration1, duration<Rep2, Period2>>>
operator+(const time_point<Clock, Duration1>& lhs, const duration<Rep2, Period2>& rhs);
template <class Rep1, class Period1, class Clock, class Duration2>
constexpr time_point<Clock, common_type_t<duration<Rep1, Period1>, Duration2>>
operator+(const duration<Rep1, Period1>& lhs, const time_point<Clock, Duration2>& rhs);
template <class Clock, class Duration1, class Rep2, class Period2>
constexpr time_point<Clock, common_type_t<Duration1, duration<Rep2, Period2>>>
operator-(const time_point<Clock, Duration1>& lhs, const duration<Rep2, Period2>& rhs);
template <class Clock, class Duration1, class Duration2>
constexpr common_type_t<Duration1, Duration2>
operator-(const time_point<Clock, Duration1>& lhs, const time_point<Clock, Duration2>& rhs);
template <class Clock, class Duration1, class Duration2>
constexpr bool operator==(const time_point<Clock, Duration1>& lhs,
const time_point<Clock, Duration2>& rhs);
template <class Clock, class Duration1, class Duration2>
constexpr bool operator!=(const time_point<Clock, Duration1>& lhs,
const time_point<Clock, Duration2>& rhs);
template <class Clock, class Duration1, class Duration2>
constexpr bool operator<(const time_point<Clock, Duration1>& lhs,
const time_point<Clock, Duration2>& rhs);
template <class Clock, class Duration1, class Duration2>
constexpr bool operator<=(const time_point<Clock, Duration1>& lhs,
const time_point<Clock, Duration2>& rhs);
template <class Clock, class Duration1, class Duration2>
constexpr bool operator>(const time_point<Clock, Duration1>& lhs,
const time_point<Clock, Duration2>& rhs);
template <class Clock, class Duration1, class Duration2>
constexpr bool operator>=(const time_point<Clock, Duration1>& lhs,
const time_point<Clock, Duration2>& rhs);
template <class ToDuration, class Clock, class Duration>
constexpr time_point<Clock, ToDuration>
time_point_cast(const time_point<Clock, Duration>& t);
Remarks: Эта функция не должна участвовать в разрешении перегрузки, если ToDuration она не является специализацией duration.
template <class ToDuration, class Clock, class Duration>
constexpr time_point<Clock, ToDuration>
floor(const time_point<Clock, Duration>& tp);
Remarks: Эта функция не должна участвовать в разрешении перегрузки, если ToDuration она не является специализацией duration.
template <class ToDuration, class Clock, class Duration>
constexpr time_point<Clock, ToDuration>
ceil(const time_point<Clock, Duration>& tp);
Remarks: Эта функция не должна участвовать в разрешении перегрузки, если ToDuration она не является специализацией duration.
template <class ToDuration, class Clock, class Duration>
constexpr time_point<Clock, ToDuration>
round(const time_point<Clock, Duration>& tp);
Remarks: Эта функция не должна участвовать в разрешении перегрузки, если ToDuration она не является специализацией durationи не treat_as_floating_point_v<typename ToDuration::rep> является false.
Объекты класса system_clock представляют время настенных часов из общесистемных часов реального времени.
class system_clock { public: using rep = see below; using period = ratio<unspecified, unspecified>; using duration = chrono::duration<rep, period>; using time_point = chrono::time_point<system_clock>; static constexpr bool is_steady = unspecified; static time_point now() noexcept; // Map to C API static time_t to_time_t (const time_point& t) noexcept; static time_point from_time_t(time_t t) noexcept; };
using system_clock::rep = unspecified;
Requires: system_clock::duration::min() < system_clock::duration::zero() будет true.
[ Note: Это означает, что rep это знаковый тип. ]
— end note
static time_t to_time_t(const time_point& t) noexcept;
static time_point from_time_t(time_t t) noexcept;
Объекты класса steady_clock представляют собой часы, для которых значения time_point никогда не уменьшаются по мере продвижения физического времени и для которых значения time_point продвигаются с постоянной скоростью относительно реального времени. То есть часы не могут быть настроены.
class steady_clock { public: using rep = unspecified; using period = ratio<unspecified, unspecified>; using duration = chrono::duration<rep, period>; using time_point = chrono::time_point<unspecified, duration>; static constexpr bool is_steady = true; static time_point now() noexcept; };
Объекты класса high_resolution_clock представляют собой часы с самым коротким периодом тика. high_resolution_clock может быть синонимом system_clock или steady_clock.
class high_resolution_clock { public: using rep = unspecified; using period = ratio<unspecified, unspecified>; using duration = chrono::duration<rep, period>; using time_point = chrono::time_point<unspecified, duration>; static constexpr bool is_steady = unspecified; static time_point now() noexcept; };
#define NULL see [support.types.nullptr] #define CLOCKS_PER_SEC see below #define TIME_UTC see below namespace std { using size_t = see [support.types.layout]; using clock_t = see below; using time_t = see below; struct timespec; struct tm; clock_t clock(); double difftime(time_t time1, time_t time0); time_t mktime(struct tm* timeptr); time_t time(time_t* timer); int timespec_get(timespec* ts, int base); char* asctime(const struct tm* timeptr); char* ctime(const time_t* timer); struct tm* gmtime(const time_t* timer); struct tm* localtime(const time_t* timer); size_t strftime(char* s, size_t maxsize, const char* format, const struct tm* timeptr); }
strftime поддерживает спецификаторов преобразования С C, D, e, F, g, G, h, r, R, t, T, u, V, и z, а также модификаторы E и O.