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) | (начиная с C++11) |
|
template
<
class
Rep1,
class
Period1,
class
Rep2,
class
Period2
>
typename
std::
common_type
<
duration
<
Rep1,Period1
>
, duration
<
Rep2,Period2
>>
::
type
|
(2) | (начиная с C++11) |
|
template
<
class
Rep1,
class
Period,
class
Rep2
>
duration
<
typename
std::
common_type
<
Rep1,Rep2
>
::
type
, Period
>
|
(3) | (начиная с C++11) |
|
template
<
class
Rep1,
class
Rep2,
class
Period
>
duration
<
typename
std::
common_type
<
Rep1,Rep2
>
::
type
, Period
>
|
(4) | (начиная с C++11) |
|
template
<
class
Rep1,
class
Period,
class
Rep2
>
duration
<
typename
std::
common_type
<
Rep1,Rep2
>
::
type
, Period
>
|
(5) | (начиная с C++11) |
|
template
<
class
Rep1,
class
Period1,
class
Rep2,
class
Period2
>
typename
std::
common_type
<
Rep1,Rep2
>
::
type
|
(6) | (начиная с C++11) |
|
template
<
class
Rep1,
class
Period,
class
Rep2
>
duration
<
typename
std::
common_type
<
Rep1,Rep2
>
::
type
, Period
>
|
(7) | (начиная с C++11) |
|
template
<
class
Rep1,
class
Period1,
class
Rep2,
class
Period2
>
typename
std::
common_type
<
duration
<
Rep1,Period1
>
, duration
<
Rep2,Period2
>>
::
type
|
(8) | (начиная с C++11) |
Выполняет базовые арифметические операции между двумя длительностями или между длительностью и количеством тактов.
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"; 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 |