两个time_point实例之间的差异不是持续时间?

时间:2013-04-25 17:31:26

标签: c++ g++

我不明白为什么这段代码会与g ++ 4.7.2一起窒息:

#include <chrono>

main ()
{
    std::chrono::system_clock::time_point t1, t2 ;
    std::chrono::seconds delay ;

    t1 = std::chrono::system_clock::time_point::max () ;
    t2 = std::chrono::system_clock::now () ;
    delay = t1 - t2 ;
    // t1 = t2 + delay ;
    // t1 = t2 - delay ;
}

错误:

test.cc: In function ‘int main()’:
test.cc:10:18: error: no match for ‘operator=’ in ‘delay = std::chrono::operator,<std::chrono::system_clock, std::chrono::duration<long int, std::ratio<1l, 1000000l> >, std::chrono::duration<long int, std::ratio<1l, 1000000l> > >((*(const std::chrono::time_point<std::chrono::system_clock, std::chrono::duration<long int, std::ratio<1l, 1000000l> > >*)(& t1)), (*(const std::chrono::time_point<std::chrono::system_clock, std::chrono::duration<long int, std::ratio<1l, 1000000l> > >*)(& t2)))’

在我看来,&#34; time_point - time_point&#34;给出了#34;持续时间&#34;。

4 个答案:

答案 0 :(得分:22)

确实会产生持续时间,但会有不同类型的持续时间。 std::chrono::duration在表示类型和单位比率上进行模板化。例如,std::chrono::seconds的单位比率为1,而std::chono::nanoseconds的单位比率为std::nano或1/1000000000。时间点具有相同的模板参数。

std::chrono::system_clock::time_point的具体单位比率是实施定义的,但几乎肯定小于std::chrono::seconds的单位比率。因此,减去这两个时间点所产生的持续时间比std::chrono::seconds所表示的精度要高得多。默认行为是不允许使用具有整数表示的持续时间丢失精度的赋值。因此,您可以使用足够精确的持续时间(std::chrono::system_clock::duration)或将结果投射到您想要的持续时间(std::chrono::duration_cast<std::chrono::seconds>(...))。

答案 1 :(得分:3)

time_point - time_point会返回duration,而不是代码中的std::chrono::seconds。您可以将std::chrono::system_clock::duration替换为duration_cast,也可以使用{{1}}转换为您需要的类型。

答案 2 :(得分:1)

两个时间点之间的差异确实是持续时间;但你无法隐式地将一种持续时间类型转换为另一种持续时间类型,因为这可能会无声地失去精确度。

如果您想将精确度从system_clock::duration降低到seconds,那么您需要使用duration_cast明确转换:

delay = duration_cast<std::chrono::seconds>(t1 - t2);

或者,您可能希望保留系统时钟的精度:

auto delay = t1 - t2; // Probably microseconds, or nanoseconds, or something

答案 3 :(得分:0)

如果转换的结果可能是实数,则编译器不允许您转换为整数持续时间。您正在使用类型为std::chrono::seconds的类型duration<*at least 35 bits integer*, ratio<1> >。 尝试使用带有浮点数的持续时间:

duration<double, 1> delay; // or duration<double> delay;
delay = t1 - t2;

或其他人提到的一些duration_cast。