template< class Rep1, class Period1, class Rep2, class Period2 > typename std::common_type<duration<Rep1,Period1>, duration<Rep2,Period2>>::type constexpr operator+( const duration<Rep1,Period1>& lhs, const duration<Rep2,Period2>& rhs ); | (1) | |
template< class Rep1, class Period1, class Rep2, class Period2 > typename std::common_type<duration<Rep1,Period1>, duration<Rep2,Period2>>::type constexpr operator-( const duration<Rep1,Period1>& lhs, const duration<Rep2,Period2>& rhs ); | (2) | |
template< class Rep1, class Period, class Rep2 > duration<typename std::common_type<Rep1,Rep2>::type, Period> constexpr operator*( const duration<Rep1,Period>& d, const Rep2& s ); | (3) | |
template< class Rep1, class Rep2, class Period > duration<typename std::common_type<Rep1,Rep2>::type, Period> constexpr operator*( const Rep1& s, const duration<Rep2,Period>& d ); | (4) | |
template< class Rep1, class Period, class Rep2 > duration<typename std::common_type<Rep1,Rep2>::type, Period> constexpr operator/( const duration<Rep1,Period>& d, const Rep2& s ); | (5) | |
template< class Rep1, class Period1, class Rep2, class Period2 > typename std::common_type<Rep1,Rep2>::type constexpr operator/( const duration<Rep1,Period1>& lhs, const duration<Rep2,Period2>& rhs ); | (6) | |
template< class Rep1, class Period, class Rep2 > duration<typename std::common_type<Rep1,Rep2>::type, Period> constexpr operator%( const duration<Rep1, Period>& d, const Rep2& s ); | (7) | |
template< class Rep1, class Period1, class Rep2, class Period2 > typename std::common_type<duration<Rep1,Period1>, duration<Rep2,Period2>>::type constexpr operator%( const duration<Rep1,Period1>& lhs, const duration<Rep2,Period2>& rhs ); | (8) |
Performs basic arithmetic operations between two durations or between a duration and a tick count.
rhs
number of ticks subtracted from the lhs
number of ticks after conversion.d
to one whose rep
is the common type between Rep1
and Rep2
, and multiples the number of ticks after conversion by s
. These overloads participate in overload resolution only if s
is convertible to typename std::common_type<Rep1, Rep2>::type
.d
to one whose rep
is the common type between Rep1
and Rep2
, and divides the number of ticks after conversion by s
. This overload participates in overload resolution only if s
is convertible to typename std::common_type<Rep1, Rep2>::type
and Rep2
is not a specialization of duration
.lhs
after conversion by the tick count of rhs
after conversion. Note that the return value of this operator is not a duration.d
to one whose rep
is the common type between Rep1
and Rep2
, and creates a duration whose tick count is the remainder of the division of the tick count, after conversion, by s
. This overload participates in overload resolution only if s
is convertible to typename std::common_type<Rep1, Rep2>::type
and Rep2
is not a specialization of duration
.lhs | - | duration on the left-hand side of the operator |
rhs | - | duration on the right-hand side of the operator |
d | - | the duration argument for mixed-argument operators |
s | - | non-duration argument for mixed-argument operators |
Assuming that CD
is the function return type and CR<A, B> = std::common_type<A, B>::type
, then:
CD(CD(lhs).count() + CD(rhs).count())
CD(CD(lhs).count() - CD(rhs).count())
CD(CD(d).count() * s)
CD(CD(d).count() / s).
CD(lhs).count() / CD(rhs).count()
(the return type of this operator is not a duration)CD(CD(d).count() % s)
CD(CD(lhs).count() % CD(rhs).count())
#include <chrono> #include <iostream> int main() { // simple arithmetic std::chrono::seconds s = std::chrono::hours(1) + 2*std::chrono::minutes(10) + std::chrono::seconds(70)/10; std::cout << "1 hour + 2*10 min + 70/10 sec = " << s.count() << " seconds\n"; // difference between dividing a duration by a number // and dividing a duration by another duration std::cout << "Dividing that by 2 minutes gives " << s / std::chrono::minutes(2) << '\n'; std::cout << "Dividing that by 2 gives " << (s / 2).count() << " seconds\n"; // the remainder operator is useful in determining where in a time // frame is this particular duration, e.g. to break it down into hours, // minutes, and seconds: std::cout << s.count() << " seconds is " << std::chrono::duration_cast<std::chrono::hours>( s ).count() << " hours, " << std::chrono::duration_cast<std::chrono::minutes>( s % std::chrono::hours(1) ).count() << " minutes, " << std::chrono::duration_cast<std::chrono::seconds>( s % std::chrono::minutes(1) ).count() << " seconds\n"; }
Output:
1 hour + 2*10 min + 70/10 sec = 4807 seconds Dividing that by 2 minutes gives 40 Dividing that by 2 gives 2403 seconds 4807 seconds is 1 hours, 20 minutes, 7 seconds
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR | Applied to | Behavior as published | Correct behavior |
---|---|---|---|
LWG 3050 | C++11 | convertibility constraint used non-const xvalue | use const lvalues instead |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/chrono/duration/operator_arith4