duration Меры типа времени между двумя точками во времени (time_pointсек). Aduration имеет представление, которое содержит количество тиков и период тиков. Тиковый период - это количество времени, которое происходит от одного тика до следующего, в секундах. Он выражается как рациональная константа с помощью шаблона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.