operator+,-,*,/,%(std::chrono::duration)
来自cppreference.com
| |
(1) | (C++11 起) |
| |
(2) | (C++11 起) |
| |
(3) | (C++11 起) |
| |
(4) | (C++11 起) |
| |
(5) | (C++11 起) |
| |
(6) | (C++11 起) |
| |
(7) | (C++11 起) |
| |
(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 | - | 运算符左侧的 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 秒 = 4807s (秒)
将其除以 2 分得到 40
将其除以 2 得到 2403 秒
4807s (秒) = 1h (时) + 20min (分) + 7s (秒)
光子从太阳飞到地球需要 8 分 20s (秒)
缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
| 缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
|---|---|---|---|
| LWG 3050 | C++11 | 可转换性约束使用非 const 亡值 | 替而使用 const 左值 |