Namespaces
Variants

operator+,-,*,/,% (std::chrono::duration)

From cppreference.net
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) (начиная с C++11)
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) (начиная с C++11)
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) (начиная с C++11)
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) (начиная с C++11)
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) (начиная с C++11)
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) (начиная с C++11)
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) (начиная с C++11)
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) (начиная с C++11)

Выполняет базовые арифметические операции между двумя длительностями или между длительностью и количеством тактов.

1) Преобразует две длительности к их общему типу и создает длительность, количество тактов которой равно сумме количеств тактов после преобразования.
2) Преобразует две длительности к их общему типу и создаёт длительность, количество тактов которой равно rhs количеству тактов, вычтенному из lhs количества тактов после преобразования.
3,4) Преобразует продолжительность d в такую, чей rep является общим типом между Rep1 и Rep2 , и умножает количество тактов после преобразования на s . Эти перегрузки участвуют в разрешении перегрузки только если s преобразуем в typename std:: common_type < Rep1, Rep2 > :: type .
5) Преобразует длительность d в такую, чей rep является общим типом между Rep1 и Rep2 , и делит количество тиков после преобразования на s . Эта перегрузка участвует в разрешении перегрузки только если s преобразуем в typename std:: common_type < Rep1, Rep2 > :: type и Rep2 не является специализацией duration .
6) Преобразует две длительности к их общему типу и делит количество тактов lhs после преобразования на количество тактов rhs после преобразования. Обратите внимание, что возвращаемое значение этого оператора не является длительностью.
7) Преобразует длительность d в такую, чей rep является общим типом между Rep1 и Rep2 , и создаёт длительность, значение которой равно остатку от деления количества тактов после преобразования на s . Эта перегрузка участвует в разрешении перегрузки только если s конвертируем в typename std:: common_type < Rep1, Rep2 > :: type и Rep2 не является специализацией duration .
8) Преобразует две длительности к их общему типу и создаёт длительность, количество тактов которой является остатком от деления количества тактов после преобразования.

Содержание

Параметры

lhs - длительность в левой части оператора
rhs - длительность в правой части оператора
d - аргумент длительности для операторов со смешанными аргументами
s - не-длительность аргумент для операторов со смешанными аргументами

Возвращаемое значение

Предполагая, что CD является типом возвращаемого значения функции и CD < A, B > = std:: common_type < A, B > :: type , тогда:

1) CD ( CD ( lhs ) . count ( ) + CD ( rhs ) . count ( ) )
2) CD ( CD ( lhs ) . count ( ) - CD ( rhs ) . count ( ) )
3,4) CD ( CD ( d ) . count ( ) * s )
5) CD ( CD ( d ) . count ( ) / s )
6) CD ( lhs ) . count ( ) / CD ( rhs ) . count ( ) (возвращаемый тип этого оператора не является duration)
7) CD ( CD ( d ) . count ( ) % s )
8) CD ( CD ( lhs ) . count ( ) % CD ( rhs ) . count ( ) )

Пример

#include <chrono>
#include <iostream>
int main()
{
    // Простая арифметика:
    std::chrono::seconds s = std::chrono::hours(1)
                           + 2 * std::chrono::minutes(10)
                           + std::chrono::seconds(70) / 10;
    std::cout << "1 час + 2*10 мин + 70/10 сек = " << s << " (секунд)\n";
    using namespace std::chrono_literals;
    // Разница между делением длительности на число
    // и делением длительности на другую длительность:
    std::cout << "Деление этого на 2 минуты дает "
              << s / 2min << '\n'
              << "Деление этого на 2 дает "
              << (s / 2).count() << " секунд\n";
    // Оператор остатка полезен для определения положения
    // данной длительности во временном интервале, например,
    // для разбивки на часы, минуты и секунды:
    std::cout << s << " (секунд) = "
              << std::chrono::duration_cast<std::chrono::hours>(
                 s) << " (час) + "
              << std::chrono::duration_cast<std::chrono::minutes>(
                 s % 1h) << " (минут) + "
              << std::chrono::duration_cast<std::chrono::seconds>(
                 s % 1min) << " (секунд)\n";
    constexpr auto sun_earth_distance{150'000'000ULL}; // км
    constexpr auto speed_of_light{300000ULL}; // км/сек
    std::chrono::seconds t(sun_earth_distance / speed_of_light); // сек
    std::cout << "Фотон летит от Солнца до Земли за "
              << t / 1min << " минут " << t % 1min << " (секунд)\n";
}

Вывод:

1 час + 2*10 мин + 70/10 сек = 4807s (секунд)
Деление этого на 2 минуты дает 40
Деление этого на 2 дает 2403 секунд
4807s (секунд) = 1h (час) + 20min (минут) + 7s (секунд)
Фотон летит от Солнца до Земли за 8 минут 20s (секунд)

Отчеты о дефектах

Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Applied to Behavior as published Correct behavior
LWG 3050 C++11 convertibility constraint used non-const xvalue use const lvalues instead