如果我将 tw
std::chrono::duration
用作三元运算符的源运算符,为什么会返回具有较大分辨率的持续时间?
#include <iostream>
#include <chrono>
#include <typeinfo>
using namespace std;
using namespace chrono;
int main()
{
auto dur = true ? 0ms : 0s;
cout << typeid(dur).name() << endl;
}
对我来说这打印......
class std::chrono::duration<__int64,struct std::ratio<1,1000> >
...与 MSVC。
使用内置类型,编译器知道两个值的公共类型是什么,但是编译器如何知道是否有两个持续时间?
这部分不是重复的:
使用内置类型,编译器知道两个值的公共类型是什么,但是编译器如何知道是否有两个持续时间?
common_type
专门用于duration
这里。
template<class Rep1, class Period1, class Rep2, class Period2>
struct common_type<chrono::duration<Rep1, Period1>,
chrono::duration<Rep2, Period2>>
{
using type = chrono::duration<common_type_t<Rep1, Rep2>, see below>;
};
它由两个
common_type
的Rep
组成。这是有趣的部分:通过 Period1
和 Period2
的最大公约数。
可以通过取两个分子的最大公约数并将其除以两个分母的最小公倍数来找到分数的最大公约数,如本注释中所述。
这是一个复杂的定义,但它可以归结为相当简单的英语:两个
common_type
的duration
将是两个参数duration
将隐式转换为的最粗略的duration
。英语是实际定义的简化,但足以正确回答这个问题。
另请注意,对于基于积分的
duration
,仅当转换是无损(精确)时才允许隐式转换。
例如
seconds
将隐式转换为 milliseconds
,但反之则不然。因为milliseconds
始终可以保存seconds
的精确值。因此,对于 seconds
和 milliseconds
,milliseconds
是 duration
和 seconds
都将隐式转换为的最粗糙 milliseconds
。因此 milliseconds
是 common_type
和 seconds
的 milliseconds
。
对于与
duration
一样精细或更精细的预定义 weeks
单位,其中两个 common_type
始终是进动更精细的那个。
weeks // C++20
days // C++20
hours
minutes
seconds
milliseconds
microseconds
nanoseconds
选择任意两个,
common_type
是此列表中较低的一个。
对于其他单位,事情可能会变得更加复杂。两个
common_type
中的 duration
甚至可以是第三种 duration
类型。例如common_type
和years
的days
是周期为216秒的duration
。果然,years
和 days
都会准确转换为这个单位。并且不存在具有更大周期的 duration
和 years
都可以准确转换为。