operator+,-,*,/,%(std::chrono::duration)
template< class Rep1, class Period1, class Rep2, class Period2 > typename std::common_type<duration<Rep1,Period1>, duration<Rep2,Period2>>::type |
(1) | |
template< class Rep1, class Period1, class Rep2, class Period2 > typename std::common_type<duration<Rep1,Period1>, duration<Rep2,Period2>>::type |
(2) | |
template< class Rep1, class Period, class Rep2 > duration<typename std::common_type<Rep1,Rep2>::type, Period> |
(3) | |
template< class Rep1, class Rep2, class Period > duration<typename std::common_type<Rep1,Rep2>::type, Period> |
(4) | |
template< class Rep1, class Period, class Rep2 > duration<typename std::common_type<Rep1,Rep2>::type, Period> |
(5) | |
template< class Rep1, class Period1, class Rep2, class Period2 > typename std::common_type<Rep1,Rep2>::type |
(6) | |
template< class Rep1, class Period, class Rep2 > duration<typename std::common_type<Rep1,Rep2>::type, Period> |
(7) | |
template< class Rep1, class Period1, class Rep2, class Period2 > typename std::common_type<duration<Rep1,Period1>, duration<Rep2,Period2>>::type |
(8) | |
Выполняет основные арифметические операции между двумя длительностями или между длительностью и числом тиков.
rep
является общим типом между Rep1
и Rep2
, и умножает количество тиков после преобразования на s.
Эти перегрузки участвуют в разрешении перегрузки, только если s можно преобразовать в typename std::common_type<Rep1, Rep2>::type.rep
, которая является общим типом между Rep1
и Rep2
, делит количество тиков после преобразования на s. Эта перегрузка участвует в разрешении перегрузки, только если s преобразуется в typename std::common_type<Rep1, Rep2>::type, а Rep2
не является специализацией duration
.rep
является общим типом между Rep1
и Rep2
, и создаёт длительность, количество тиков которой является остатком от деления счётчика тиков после преобразования на s. Эта перегрузка участвует в разрешении перегрузки, только если s преобразуется в typename std::common_type<Rep1, Rep2>::type, а Rep2
не является специализацией duration
.Содержание |
[править] Параметры
lhs | — | длительность слева от оператора |
rhs | — | длительность справа от оператора |
d | — | аргумент длительности для операторов со смешанными аргументами |
s | — | аргумент не длительность для операторов со смешанными аргументами |
[править] Возвращаемое значение
Предполагая, что CD является типом возвращаемого значения функции и CD<A, B> = std::common_type<A, B>::type, тогда:
[править] Пример
#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 |