boost::posix_time::milliseconds和boost::chrono::milliseconds的区别

5

我正在尝试使用condition_variable_any::timed_wait()

当我将boost::chrono::millisecond传递给函数时,它无法编译:

error: no match for ‘operator+’ in ‘boost::get_system_time() + wait_duration’

然而,如果我将 boost::posix_time::milliseconds 传递到函数中,它确实可以编译通过。
问题在于,我不理解两者之间的区别。它们都声称是持续时间。但是根据我的理解,posix时间代表自纪元以来的时间,这意味着 boost::posix_time::milliseconds p(1000) 表示自纪元后1秒的时间。我认为这不是一个持续时间。
我错过了什么吗?有人能解释一下区别吗?

2
你缺乏对强类型的基本理解。 - Lightness Races in Orbit
1个回答

6

虽然我不是开发人员或标准委员会的一部分,但是我会尝试解答这个问题。

Boost是一个创意平台,它可能在某一天被整合到标准库中。因此,它通常存在与其他地方不同的怪异之处。

boost::posix_time是posix_time数据结构的包装器。POSIX(便携式操作系统接口)是由IEEE提供的一组标准,旨在让所有操作系统和程序使用类似的语言进行通信(暴露了一个秘密,实际上并没有)。POSIX定义了时间和时间差的固定点数系统,但该结构的分辨率有所不同。在BOOST中,分辨率可以在编译时配置。该库的目的是更轻松地操作POSIX兼容的时间结构。在1.31版本之前引入。

boost::chrono(已集成到C++11中作为std :: chrono)是一个通用的时间刻度库。其目标是具有一组良好处理时间的功能和结构,并允许用户配置底层数据类型。没有努力与任何标准保持一致。在1.51版中引入。

虽然这(100%)是两个执行相同任务的库,但它们的实现方式略有不同。在像Boost这样的系统中,这可能是不可避免的:随着新语言功能和编程要求的出现,您可能希望完全重构某些内容但需要保持(有点)向后兼容性。但它导致了一个奇怪的问题:不同的实现,只会让你感到混乱。因为POSIX时间非常古老,大多数接口(例如condition_variable_any :: timed_wai)只有posix_time接口。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接