现在使用C ++ 17 published,标准库现在涵盖了更多的Boost库:可选,变体,任何,ASIO(在网络TS中),协同程序(在TS中)等等。除了标准中已有的Boost东西之外,还有this answer。我意识到一些标准化版本的设计空间选择与Boost相比略有不同,但基本上它们是相同的。
鉴于这一事实,是否有计划发布Boost的替代版本(或仅仅是 - 一个新的主线版本):
如果不是 - 这是因为Boost设计选择的重要性吗?麻烦太多了?害怕“项目分歧”?
注意:这是一个信息性问题,所以请不要提供您的意见,或者这是不是一个好主意。
答案 0 :(得分:3)
Boost比许多当前现有的标准C ++库实现具有更好的实现。
请注意:
<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不允许你这样做。
<system_error>
在Linux上使用glibc:
std::error_category::message
不是线程安全的,尽管它应该是。 Boost.System至少试图为每个平台提供线程安全的实现。在Windows(MSVC)上,它在多个地方被破坏:
std::system_category
返回的错误消息令人烦恼&#34; \ r \ n&#34;最后,这在其他任何地方都不会发生。 Boost.System明确地修改了那些。std::error_category
的地址对通用和系统类别不起作用。 Boost.System从未遇到过这个问题。std::atexit
注册析构函数。首次从另一个atexit
处理程序访问类别时。这可能是一个问题,可能导致死锁(如任何隐式锁定)。我过去有过这方面的经验。关于<system_error>
的可悲部分是<filesystem>
和未来的网络库(ASIO)都非常依赖它,所以在Windows上都有点破解。
<mutex>
,<condition_variable>
,<shared_mutex>
。直到最近在Windows和MSVC std::condition_variable
和std::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的实现也不是最快的。