通过三元运算符获得两个计时持续时间

问题描述 投票:0回答:1

如果我将 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。

使用内置类型,编译器知道两个值的公共类型是什么,但是编译器如何知道是否有两个持续时间?

c++ c++11
1个回答
0
投票

这部分不是重复的:

使用内置类型,编译器知道两个值的公共类型是什么,但是编译器如何知道是否有两个持续时间?

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
都可以准确转换为。
    

© www.soinside.com 2019 - 2024. All rights reserved.