Пространства имён
Варианты
Действия

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

Материал из cppreference.com
< cpp‎ | chrono‎ | duration
 
 
Библиотека утилит
Языковая поддержка
Поддержка типов (базовые типы, RTTI)
Макросы тестирования функциональности библиотеки (C++20)    
Управление динамической памятью
Программные утилиты
Поддержка сопрограмм (C++20)
Вариативные функции
Трёхстороннее сравнение (C++20)
(C++20)
(C++20)(C++20)(C++20)(C++20)(C++20)(C++20)
Общие утилиты
Дата и время
Функциональные объекты
Библиотека форматирования (C++20)
(C++11)
Операторы отношения (устарело в C++20)
Целочисленные функции сравнения
(C++20)(C++20)(C++20)    
(C++20)
Операции обмена и типа
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
Общие лексические типы
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
Элементарные преобразования строк
(C++17)
(C++17)
 
 
 
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)

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

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() (возвращаемый тип этого оператора не является длительностью)
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";
}

Вывод:

1 час + 2*10 минут + 70/10 секунд = 4807s (секунд)
Разделив это на 2 минуты, получим 40
Разделив это на 2, получим 2403 секунды
4807s (секунд) = 1h (часов) + 20min (минут) + 7s (секунд)

[править] Отчёты о дефектах

Следующие изменения поведения были применены с обратной силой к ранее опубликованным стандартам C++:

Номер Применён Поведение в стандарте Корректное поведение
LWG 3050 C++11 ограничение конвертируемости использовало неконстантное xvalue вместо этого используются константные
lvalue