24

我不明白为什么这段代码会被 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)))’

在我看来,“time_point - time_point”给出了一个“持续时间”。

4

4 回答 4

34

它确实会产生一个持续时间,但有不同类型的持续时间。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>(...))。

于 2013-04-25T17:47:35.747 回答
5

time_point - time_point确实返回 a duration,而不是代码中的那个。您可以替换std::chrono::secondsstd::chrono::system_clock::duration,或者您可以使用 aduration_cast转换为您需要的类型。

于 2013-04-25T17:43:16.290 回答
4

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

如果您想从 to 降低精度system_clock::durationseconds则需要使用 a 进行显式转换duration_cast

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

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

auto delay = t1 - t2; // Probably microseconds, or nanoseconds, or something
于 2013-04-25T17:49:05.583 回答
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 。

于 2020-09-23T15:15:21.337 回答