现在使用C++ 17 published,标准库现在涵盖了甚至更多的Boost库:可选,变体,任何,ASIO(在Networking TS中),协程(在TS中)等等。除了标准中已经包含的gob和Boost的gob,还请参见this answer。我意识到某些标准化版本的设计空间选择与Boost的略有不同,但本质上是相同的。
鉴于这一事实,是否有计划发布Boost的替代版本(或只是-一个新的主线版本),其中包括:
?
如果不是-这是因为Boost设计选择的重要性吗?麻烦太多了吗?担心“项目 fork ”?
注意:这是一个有用的问题,因此请不要提供您的意见或这是否是一个好主意。
最佳答案
与许多当前现有的标准C++库实现相比,Boost具有更好的实现。
注意:
Boost.Filesystem vs
<filesystem>
Windows在两个C/C++运行时中均不支持Unicode,例如您不能将标准库切换为支持Unicode的窄字符集(UTF-8)。结果,与
std::filesystem::path
序列一起使用时,char
始终采用非unicode编码。有std::filesystem::u8path
,但是写imot的std::filesystem::path p = some_char_sequence
太简单了。任何使用std::filesystem
并支持Windows的代码库都必须不断地与之抗争。Boost.Filesystem允许用户指定要用于
path
对象的语言环境。 Boost.Locale可用于在Windows上创建UTF-8语言环境,从而消除了此问题。 Std.filesystem不允许您执行此操作。Boost.System与
<system_error>
在具有glibc的Linux上:
std::error_category::message
虽然应该安全,但不是线程安全的。 Boost.System至少尝试为每个平台提供线程安全的实现。 在Windows(MSVC)上,它在多个地方损坏:
std::system_category
返回的错误消息的结尾带有令人讨厌的“\r\n”,在其他任何地方都不会发生。 Boost.System明确地修剪了那些。 std::error_category
的比较地址不适用于一般类别和系统类别。 Boost.System从来没有这个问题。 std::atexit
注册析构函数。第一次从另一个atexit
处理程序访问category时。这可能是一个问题,并且可能导致死锁(因为任何隐式锁定)。我过去有过这个经验。 关于
<system_error>
的可悲部分是<filesystem>
和将来的网络库(ASIO)都严重依赖它,因此在Windows上它们都有些破损。Boost.Thread与
<mutex>
,<condition_variable>
,<shared_mutex>
。直到最近在Windows和MSVC上,由于在内部使用惰性初始化,在dll中实例化时,
std::condition_variable
和std::mutex
可能会导致死锁。对于MSVC14(Visual Studio 2015),至少应针对std::mutex
修复此问题,因为它已被重写为在内部使用SRW锁,但是我不确定条件变量。 MSVC12(Visual Studio 2013)肯定有很多错误。如果您需要读取器-写入器锁,那么了解它是否有利于读取器或写入器可能非常重要。标准
std::shared_mutex
不允许您指定此行为,并且根据the original proposal这样做是因为存在一种算法,该算法允许实现不偏爱这两种情况并尝试防止两者的饥饿(某种“公平”锁定)。原始实现方式boost::shared_mutex
遵循此算法,并且不是基于pthread_rwlock_t
(由于POSIXas std::shared_mutex
的要求,它通常对读者有利。Imo这意味着std::shared_mutex
在许多系统上的实现都较差。尽管Boost实现也不是最快的。
关于c++ - WIll Boost的版本带有现代C++ "cutoff"吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48724474/