WIll Boost有一个带有现代C ++“截止”的版本吗?

时间:2018-02-10 18:59:15

标签: c++ boost deprecated

现在使用C ++ 17 published,标准库现在涵盖了更多的Boost库:可选,变体,任何,ASIO(在网络TS中),协同程序(在TS中)等等。除了标准中已有的Boost东西之外,还有this answer。我意识到一些标准化版本的设计空间选择与Boost相比略有不同,但基本上它们是相同的。

鉴于这一事实,是否有计划发布Boost的替代版本(或仅仅是 - 一个新的主线版本):

  • 将大多数或所有这些功能作为Boost库放弃
  • 让其余的Boost代码依赖于它们在标准库中的可用性
  • 让Boost代码依赖于至少是C ++ 17的语言,让生活变得更轻松,代码对开发人员更加敏感

如果不是 - 这是因为Boost设计选择的重要性吗?麻烦太多了?害怕“项目分歧”?

注意:这是一个信息性问题,所以请不要提供您的意见,或者这是不是一个好主意。

1 个答案:

答案 0 :(得分:3)

Boost比许多当前现有的标准C ++库实现具有更好的实现。

请注意:

  • 某些问题可能会在最新版本的编译器中修复,在撰写此帖之前我没有重新检查所有内容。
  • Boost相当保守,支持许多旧的编译器。即使最新的编译器已经修复了所有内容,旧版本仍然需要工作。
  • 关于Unicode,我假设C ++程序将尝试遵循UTF-8 Everywhere

Boost.Filesystem vs <filesystem>

Windows在两个C / C ++运行时都不支持Unicode,例如您无法将标准库切换为支持Unicode的窄字符集(UTF-8)。结果std::filesystem::path在与char序列一起使用时始终采用非unicode编码。这有std::filesystem::u8path,但写std::filesystem::path p = some_char_sequence imo 太容易了。任何使用std::filesystem并支持Windows的代码库都必须经常与之斗争。

Boost.Filesystem允许用户指定用于path个对象的语言环境。 Boost.Locale可用于在Windows上创建UTF-8语言环境,从而消除此问题。 Std.filesystem不允许你这样做。

Boost.System与<system_error>

在Linux上使用glibc:

  • std::error_category::message不是线程安全的,尽管它应该是。 Boost.System至少试图为每个平台提供线程安全的实现。
  • 系统类别无法测试标准错误条件的等效性。

在Windows(MSVC)上,它在多个地方被破坏:

  • std::system_category返回的错误消息令人烦恼&#34; \ r \ n&#34;最后,这在其他任何地方都不会发生。 Boost.System明确地修改了那些。
  • 如果使用cross-dll,则比较std::error_category的地址对通用和系统类别不起作用。 Boost.System从未遇到过这个问题。
  • 使用当前用户enconding返回错误消息(从不使用UTF-8)。从技术上讲,这是允许的,因为标准没有指定此处使用的编码,但它对任何人都没有帮助。虽然Boost.System做了同样的事情(这里不应该提到?)。
  • 标准错误类别是静态 - 本地单例,因此通过std::atexit注册析构函数。首次从另一个atexit处理程序访问类别时。这可能是一个问题,可能导致死锁(如任何隐式锁定)。我过去有过这方面的经验。
  • 系统类别无法将WinAPI错误代码与POSIX错误代码相匹配,就像Boost.System一样(这首先是该工具的重点)。
  • 在MSVC12(Visual Studio 2013)上,比较错误类别在dll中不起作用。这是Boost支持的编译器之一。 Boost.System没有这样的问题。

关于<system_error>的可悲部分是<filesystem>和未来的网络库(ASIO)都非常依赖它,所以在Windows上都有点破解。

Boost.Thread vs <mutex><condition_variable><shared_mutex>

直到最近在Windows和MSVC std::condition_variablestd::mutex由于在内部使用延迟初始化而在dll中实例化时可能导致死锁。使用MSVC14(Visual Studio 2015),这应该至少修复为std::mutex,因为它被重写为内部使用SRW锁,但我不确定条件变量。 MSVC12(Visual Studio 2013)肯定有很多错误。

如果您需要读写器锁定,那么了解它是否有利于读者或作者可能非常重要。标准std::shared_mutex不允许您指定此行为,并且根据the original proposal这已经完成,因为有一种算法允许实现既不支持也不试图阻止两者的饥饿(有些&#34;公平& #34;锁定)。原始实施例如boost::shared_mutex遵循此算法,并不基于pthread_rwlock_t(由于POSIXas std::shared_mutex的要求,它通常有利于读者.Imo这意味着std::shared_mutex在许多系统上的实现很差。虽然Boost的实现也不是最快的。