命名空间
变体
操作

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 转换为其 `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() (此运算符的返回值类型不是时长)
7) CD(CD(d).count() % s)
8) CD(CD(lhs).count() % CD(rhs).count())

[编辑] 示例

#include <chrono>
#include <iostream>
 
int main()
{
    // Simple arithmetic:
    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 << " (seconds)\n";
 
    using namespace std::chrono_literals;
 
    // Difference between dividing a duration by a number
    // and dividing a duration by another duration:
    std::cout << "Dividing that by 2 minutes gives "
              << s / 2min << '\n'
              << "Dividing that by 2 gives "
              << (s / 2).count() << " seconds\n";
 
    // The remainder operator is useful in determining where
    // in a time frame is this particular duration, e.g. to
    // break it down into hours, minutes, and seconds:
    std::cout << s << " (seconds) = "
              << std::chrono::duration_cast<std::chrono::hours>(
                 s) << " (hour) + "
              << std::chrono::duration_cast<std::chrono::minutes>(
                 s % 1h) << " (minutes) + "
              << std::chrono::duration_cast<std::chrono::seconds>(
                 s % 1min) << " (seconds)\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 << "A photon flies from the Sun to the Earth in "
              << t / 1min << " minutes " << t % 1min << " (seconds)\n";
}

输出

1 hour + 2*10 min + 70/10 sec = 4807s (seconds)
Dividing that by 2 minutes gives 40
Dividing that by 2 gives 2403 seconds
4807s (seconds) = 1h (hour) + 20min (minutes) + 7s (seconds)
A photon flies from the Sun to the Earth in 8 minutes 20s (seconds)

[编辑] 缺陷报告

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

DR 应用于 已发布的行为 正确的行为
LWG 3050 C++11 可转换性约束使用非 const xvalue 使用 const 左值代替