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) 将两个时长转换为它们的公共类型,并创建一个时长对象,其计次数值为转换后 lhs 的计时次数减去 rhs 的计时次数。
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秒 = 4807秒 (秒)
将其除以2分钟得到 40
将其除以2得到 2403 秒
4807秒 (秒) = 1小时 (小时) + 20分钟 (分钟) + 7秒 (秒)
光子从太阳飞到地球需要 8 分钟 20秒 (秒)

缺陷报告

以下行为变更缺陷报告被追溯应用于先前发布的C++标准。

缺陷报告 应用于 发布时的行为 正确行为
LWG 3050 C++11 可转换性约束使用了非const右值 改用const左值