operator+,-,*,/,%(std::chrono::duration)
typename std::common_type <duration<Rep1,Period1>, duration<Rep2,Period2>>::type
constexpr operator+( const duration<Rep1,Period1>& lhs,
typename std::common_type <duration<Rep1,Period1>, duration<Rep2,Period2>>::type
constexpr operator-( const duration<Rep1,Period1>& lhs,
duration<typename std::common_type <Rep1,Rep2>::type, Period>
constexpr operator*( const duration<Rep1,Period>& d,
duration<typename std::common_type <Rep1,Rep2>::type, Period>
constexpr operator*( const Rep1& s,
duration<typename std::common_type <Rep1,Rep2>::type, Period>
constexpr operator/( const duration<Rep1,Period>& d,
typename std::common_type <Rep1,Rep2>::type
constexpr operator/( const duration<Rep1,Period1>& lhs,
duration<typename std::common_type <Rep1,Rep2>::type, Period>
constexpr operator%( const duration<Rep1, Period>& d,
typename std::common_type <duration<Rep1,Period1>, duration<Rep2,Period2>>::type
constexpr operator%( const duration<Rep1,Period1>& lhs,
Performs basic arithmetic operations between two durations or between a duration and a tick count.
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.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
.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
.[edit] Parameters
[edit] Return value
Assuming that CD is the function return type and CD<A, B> = std::common_type <A, B>::type, then:
[edit] Example
#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 << " (seconds)\n"; using namespace std::chrono_literals; // Difference between dividing a duration by a number // and dividing a duration by another duration: std::cout << "Dividing that by 2 minutes gives " << s / 2min << '\n' << "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 << " (seconds) = " << std::chrono::duration_cast <std::chrono::hours >( s) << " (hour) + " << std::chrono::duration_cast <std::chrono::minutes >( s % 1h) << " (minutes) + " << std::chrono::duration_cast <std::chrono::seconds >( s % 1min) << " (seconds)\n"; constexpr auto sun_earth_distance{150'000'000ULL}; // km constexpr auto speed_of_light{300000ULL}; // km/sec std::chrono::seconds t(sun_earth_distance / speed_of_light); // sec std::cout << "A photon flies from the Sun to the Earth in " << t / 1min << " minutes " << t % 1min << " (seconds)\n"; }
Output:
1 hour + 2*10 min + 70/10 sec = 4807s (seconds) Dividing that by 2 minutes gives 40 Dividing that by 2 gives 2403 seconds 4807s (seconds) = 1h (hour) + 20min (minutes) + 7s (seconds) A photon flies from the Sun to the Earth in 8 minutes 20s (seconds)
[edit] Defect reports
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 |