2013-04-25 70 views
15

我不明白为什么这个代码使用g ++ 4.7.2扼流圈:两个time_point实例之间的差异不是持续时间?

#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

噢,是的,对,C++编译器**仍**吸吮错误信息。 – 2013-04-25 17:45:17

+0

@KonradRudolph库作者可以使用更自由的'static_assert'用法大大改善它们,我不知道他们为什么不这样做。 – 2013-04-25 17:49:57

+0

@DavidBrown:您不能使用'static_assert'来报告是否存在合适的函数/运算符过载。概念可能有所帮助,但它们还不存在。 – 2013-04-25 17:54:34

回答

19

它确实会产生持续时间,但持续时间有多种。 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>(...))。

+0

非常感谢您的回答。所以,如果我使用std :: chrono :: nanoseconds类型作为延迟变量,那么我就不会注意到这个问题,而且我也没有学到一件重要的事情! – pdagog 2013-04-26 06:31:31

+0

@pdagog'std :: chrono :: nanoseconds'不一定会起作用(至少不是无处不在)。 'std :: chrono :: system_clock :: time_point'可能在几纳秒,或者它可能更小。这就是为什么你应该使用'std :: chrono :: system_clock :: duration'。 – 2013-04-26 06:39:57

+0

当然:我应该说:“所以,如果我已经使用了std :: chrono :: nanoseconds类型的延迟变量,_这似乎是我的system_上的时钟谷物,我不会注意到......”。感谢精确度。 – pdagog 2013-04-26 12:05:19

3

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

1

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

如果你想精度降低system_clock::durationseconds,那么你需要进行转换明确使用duration_cast

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

或者,你可能想保留系统时钟的精度:

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