ein*_*ica 5 c++ boost deprecated
现在已经发布了 C++ 17 ,标准库现在涵盖了更多的Boost库:可选,变体,任何,ASIO(在网络TS中),协同程序(在TS中)等等.除了标准中已有的Boost东西之外,还有这个答案.我意识到一些标准化版本的设计空间选择与Boost相比略有不同,但基本上它们是相同的.
鉴于这一事实,是否有计划发布Boost的替代版本(或者只是 - 一个新的主线版本):
?
如果不是 - 这是因为Boost设计选择的重要性吗?麻烦太多了?害怕"项目分歧"?
注意:这是一个提供信息的问题,所以请不要提供您的意见或是否这是一个好主意.
小智 3
Boost 的实现比许多当前现有的标准 C++ 库的实现更好。
注意:
<filesystem>Windows 在 C/C++ 运行时中不支持 Unicode,例如,您无法将标准库切换到支持 Unicode 的窄字符集 (UTF-8)。因为当与序列一起使用时,结果std::filesystem::path始终假定非 unicode 编码char。有std::filesystem::u8path这个,但std::filesystem::path p = some_char_sequence在我看来写起来太容易了。任何使用std::filesystem和支持 Windows 的代码库都必须不断地应对这一问题。
Boost.Filesystem 允许用户指定用于path对象的区域设置。Boost.Locale 可用于在 Windows 上创建 UTF-8 区域设置,从而消除此问题。Std.filesystem 不允许您执行此操作。
<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处理程序访问类别时。这可能是一个问题,并可能导致死锁(与任何隐式锁定一样)。我过去有过这方面的经验。可悲的<system_error>是,它<filesystem>和未来的网络库 (ASIO) 都严重依赖它,因此在 Windows 上都有点崩溃。
<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不允许您指定此行为,并且根据最初的提案,这样做是因为有一种算法允许实现不偏向任何一个,并尝试防止两者的饥饿(有点“公平”锁)。原始实现例如boost::shared_mutex遵循该算法而不是基于pthread_rwlock_t(由于 POSIXas 的要求,这通常有利于读者std::shared_mutex。我认为这意味着std::shared_mutex在许多系统上的实现很差。尽管 Boost 实现也不是最快的。