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

来自cppreference.com
< cpp‎ | chrono‎ | duration


 
 
工具库
语言支持
类型支持(基本类型、RTTI)
库功能特性测试宏 (C++20)
动态内存管理
程序工具
协程支持 (C++20)
变参数函数
调试支持
(C++26)
三路比较
(C++20)
(C++20)(C++20)(C++20)
(C++20)(C++20)(C++20)
通用工具
日期和时间
函数对象
格式化库 (C++20)
(C++11)
关系运算符 (C++20 中弃用)
整数比较函数
(C++20)(C++20)(C++20)   
(C++20)
交换类型运算
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
常用词汇类型
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
初等字符串转换
(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) (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 到其 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 为函数返回类型且 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}; // km
    constexpr auto speed_of_light{300000ULL}; // km/sec
    std::chrono::seconds t(sun_earth_distance / speed_of_light); // sec
    std::cout << "光子从太阳飞到地球需要  "
              << t / 1min << " 分 " << t % 1min << " (秒)\n";
}

输出:

1 时 + 2*10 分 + 70/10 秒 = 4807 (秒)
将其除以 2 分得到 40
将其除以 2 得到 2403 秒
4807s (秒) = 1h (时) + 20min (分) + 7s (秒)
光子从太阳飞到地球需要 8 分 20s (秒)

缺陷报告

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

缺陷报告 应用于 出版时的行为 正确行为
LWG 3050 C++11 可转换性约束使用非 const 亡值 替而使用 const 左值