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

来自cppreference.com
< cpp‎ | chrono‎ | duration
 
 
工具库
通用工具
格式化库 (C++20)
(C++11)
关系运算符 (C++20 中弃用)
整数比较函数
(C++20)(C++20)(C++20)
(C++20)
swap 与类型运算
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
常用词汇类型
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)

初等字符串转换
(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) 转换二个时长到其共用类型,并创建计次数为转换后从 lhs 的计次数减去 rhs 的计次数的时长。
3-4) 转换时长 d 到其 repRep1Rep2 之间的共用类型的时长,并将转换后的计次数乘 s 。这些重载仅若 s 可转换到 typename std::common_type<Rep1, Rep2>::type 才参与重载决议。
5) 转换时长 d 到其 repRep1Rep2 之间的共用类型的时长,并将转换后的计次数除以 s 。此重载仅若 s 可转换到 typename std::common_type<Rep1, Rep2>::typeRep2 不是 duration 的特化才参与重载决议。
6) 转换二个时长到其共用类型,并将 lhs 转换后的计次数除以 rhs 转换后的计次数。注意此运算符的返回值不是时长。
7) 转换时长 d 到其 repRep1Rep2 之间的共用类型的时长,并创建计次数为此时长的计次数除以 s 的时长。此重载仅若 s 可转换到 typename std::common_type<Rep1, Rep2>::typeRep2 不是 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 左值