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

< cpp‎ | chrono‎ | duration

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) 转换二个时长到其共用类型，并创建计次数为转换后从 `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 | - | 运算符左侧的 duration
rhs | - | 运算符右侧的 duration
d | - | 混合参数运算符的时长参数
s | - | 混合参数运算符的计次参数

### 返回值

假设 CD 为函数返回类型且 CR<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 hour + 2*10 min + 70/10 sec = " << s.count() << " seconds\n";

        // 时长除以一个数和时长除以另一时长的区别
        std::cout << "Dividing that by 2 minutes gives "
                  << s / std::chrono::minutes(2) << '\n';
        std::cout << "Dividing that by 2 gives "
                  << (s / 2).count() << " seconds\n";

       // 余数运算符在确定此特定时长在时间框架的场合有用，
       // 例如，拆分它为时、分和秒：
       std::cout << s.count() << " seconds is "
                 << std::chrono::duration_cast<std::chrono::hours>(
                        s
                    ).count() << " hours, "
                 << std::chrono::duration_cast<std::chrono::minutes>(
                        s % std::chrono::hours(1)
                    ).count() << " minutes, "
                 << std::chrono::duration_cast<std::chrono::seconds>(
                        s % std::chrono::minutes(1)
                    ).count() << " seconds\n";
    }

输出：

    1 hour + 2*10 min + 70/10 sec = 4807 seconds
    Dividing that by 2 minutes gives 40
    Dividing that by 2 gives 2403 seconds
    4807 seconds is 1 hours, 20 minutes, 7 seconds

### 缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

DR | 应用于 | 出版时的行为 | 正确行为
--- | --- | --- | ---
LWG 3050 | C++11 | 可转换性制约使用非 const 亡值 | 替而使用 const 左值