Boost C++ 库

...世界上最受尊敬和精心设计的 C++ 库项目之一。 Herb SutterAndrei Alexandrescu, C++ 编码标准

版本 1.75.0

版本 1.75.0

2020年12月11日 19:50 GMT

文档

下载
平台文件SHA256 哈希
unixboost_1_75_0.tar.bz2953db31e016db7bb207f11432bef7df100516eeb746843fa0486a222e3fd49cb
boost_1_75_0.tar.gzaeb26f80e80945e82ee93e5939baebdca47b9dee80a07d3144be1e1a6a66dd6a
windowsboost_1_75_0.7z3a8b314871646e7404886736273c053278ba71b11347f72d4751411d65d6d1a5
boost_1_75_0.zipcaf36d7c13b3d8ce62282a64a695113945a13b0f1796a45160726d04295f95ed
* 这些下载链接由 C++ 联盟 的捐赠支持。

已知问题

Boost.Operators 当前与 C++20 不兼容,在某些情况下,当调用比较运算符时,可能会表现为运行时无限递归或无限循环。此问题是由 C++20 中引入的新的运算符重写行为引起的。作为一种变通方法,建议用户以 C++17 或更早的 C++ 标准为目标。更多详细信息可以在 #65 中找到。

新库

  • JSON: 来自 Vinnie Falco 和 Krystian Stasiowski 的 C++11 中的 JSON 解析、序列化和 DOM。
    • 仅需 C++11 的快速编译
    • 具有分配器支持的简单且安全的现代 API
    • 不使用 Boost 进行编译,定义 BOOST_JSON_STANDALONE
    • 可选的仅头文件,无需链接到库
  • LEAF: 来自 Emil Dotchevski 的 C++11 轻量级错误处理库。
    • 小型单头文件格式,无依赖项。
    • 专为最大效率而设计(“快乐”路径和“悲伤”路径)。
    • 即使使用重负载,也无需动态内存分配。
    • 任意错误类型的 O(1) 传输(与调用堆栈深度无关)。
    • 可以与或不使用异常处理一起使用。
  • PFR: 来自 Antony Polukhin 的,无需宏或样板代码即可为用户定义类型进行基本反射。

更新的库

  • Asio:
    • 启用对 Windows 上 UNIX 域套接字的支持。
    • ip::basic_resolver 添加了执行器转换构造和赋值。
    • 添加了多态执行器和(已弃用的)处理程序调用钩子之间的兼容性。
    • 添加了 experimental::as_single 完成令牌适配器。
    • 通过使用 _POSIX_VERSION 检测是否支持,在更多平台上添加了对 MSG_NOSIGNAL 的支持。
    • 添加了在 Windows 上使用 libpthread 进行编译的能力。
    • 添加了对 Intel C++ 编译器的解决方法。
    • 添加了更多对检测和优化没有自定义执行器的处理程序的支持。
    • 减少了 Windows 上定时器取消的锁争用。
    • 恢复了先前删除的空指针检查,因为它对性能产生了可衡量的影响。
    • 修复了 executor 概念以测试 const 限定的 execute()
    • 修复了不支持 RTTI 的构建的 any_executor 支持。
    • 修复了 thread_pool 单元测试以在不支持 RTTI 的情况下工作。
    • 修复了 Windows 上 clang 的 C++20 协程兼容性。
    • 修复了与 Windows Runtime 的一些兼容性问题。
    • 修复了由于添加 asio::query 引起的阴影名称警告。
    • 修复了 linux 上“相等表达式的逻辑‘或’”警告。
    • 修复了良性的开关失败警告。
    • 添加了缺失的 push/pop_options.hpp 包含。
    • 禁止了零作为空指针常量警告。
    • 修复了逗号运算符警告。
    • 更新了文档,以阐明何时select在 Windows 上使用反应器。
    • 修复了由 any_executor 比较和转换引起的潜在歧义。
    • 添加了对 MSVC 19.8 上非实验性 C++20 协程的检测。
    • 修复了与 uClibc 的兼容性。
    • 修复了当目标为较旧的 C++ 版本或不那么兼容的编译器时,Networking TS 执行器的 strand<> 适配。
    • 有关更多详细信息,请查阅 修订历史
  • 原子:
    • 实现了内部锁池实现中使用的地址查找算法的 SSE2 和 SSE4.1 版本。这可能会提高在高度争用的情况下等待和通知操作的性能。
    • 修复了由于为带有立即常量的按位(逻辑)运算生成的指令不正确而可能导致 AArch64 目标上出现编译错误。(#41
  • Beast:
    • 此更新带来了错误修复,并支持来自 Boost.Asio 的 BOOST_ASIO_ENBALE_HANDLER_TRACKING 编译标志
    • 我们很想知道您或您的公司如何使用 Beast,请考虑将条目添加到 使用 Beast 的公司和个人 列表中。
    • 有关完整的更改列表,请参阅完整的 发行说明
  • 容器:
    • 新的 devector 容器。
    • 修复的错误/问题
      • #152 基于树的容器在移动专用类型时遇到问题。
      • #156 使用向量编译错误。
      • PR#157 添加缺失的包含。
      • #159:pmr::monotonic_buffer_resource 在大型单次分配时崩溃。
      • #160:uses_allocator 的用法需要 remove_cvref_t。
      • #162:MSVC x86 上的 small_vector 按值调用崩溃。
      • #161:polymorphic_allocator(memory_resource*) 非标准扩展导致麻烦。
      • PR#163:带有选项的 small_vector 的 container_rebind。
      • #165:共享库和 memory_resource 内联成员的链接错误。
      • PR#166:修复版权标题中的编码错误。
      • PR#167:错误:'msg' 的地址在 GCC 4.4 中始终评估为 'true' 警告。
      • #169:在 clang11 上构建 dlmalloc_ext_2_8_6.c 时出现大量警告。
  • 字节序:
    • endian_arithmetic 不再继承自 endian_buffer
    • 当定义 BOOST_ENDIAN_NO_CTORS 时,未对齐的 endian_bufferendian_arithmetic 是 C++03 POD,以允许使用 __attribute__((packed))
  • 文件系统:
    • 新:添加了 creation_time 操作,该操作允许获取文件创建时间。(灵感来自 PR#134
    • 在失败的情况下,last_write_time(p, ec) 操作的返回值已更改为 std::time_t 可表示的最小值而不是 -1。
    • 在失败的情况下,hard_link_count(p, ec) 操作的返回值已更改为 static_cast<uintmax_t>(-1) 而不是 0。
    • 在 POSIX 系统上,如果路径解析为非普通文件,则 file_size 现在将指示错误代码 errc::function_not_supported。之前,报告了 errc::operation_not_permitted
    • 在 Linux 上,许多操作现在在内部尽可能使用 statx 系统调用,这可以减少从文件系统查询的信息量并可能提高性能。statx 系统调用是在 Linux 内核 4.11 中引入的。
    • 从某些 path 方法的返回类型中删除了 const 限定。这可能会在某些情况下阻止调用站点上的移动构造和移动赋值。(#160
    • 在 OpenBSD 4.4 及更高版本上,使用 statvfs 系统调用来获取文件系统空间信息。(灵感来自 PR#162
    • 在 Windows 上,如果提供的路径未标识现有文件,则 space 现在会返回错误。(#167
  • 几何:
    • 警告:在 Boost 1.73 发布 C++03 的弃用通知后,从现在开始,Boost.Geometry 需要一个功能强大的 C++14 编译器。
    • 改进
      • PR#726 用于面积、包络、扩展的伞形策略(目前未记录)。
      • PR#733 添加了 std::array<> 适应 Point 概念的示例(感谢 Ben FrantzDale)。
      • PR#745 在几何和算术中添加了 constexpr。
      • PR#747 添加了可选的 traits::make(目前未记录)。
      • PR#748 现代化了类型特征的用法。
      • PR#759 MPL_ASSERT 已替换为标准 static_assert。
      • PR#767 现代化了元组的用法。
    • 已解决的问题
      • #716 悬空代理引用。
    • 错误修复
      • 集合操作和缓冲区中的各种修复。
  • GIL:
    • 重大变化:在下一个版本中,我们将放弃对 GCC 5 的支持。我们还可能将所需的最低 C++ 版本从 C++11 更改为 C++14。
  • 直方图:
    • 此更新带来了
      • 针对极端情况的错误修复
      • 小型文档改进
      • 修复了最新编译器和针对 C++20 标准编译时的新警告
    • 有关完整的更改列表,请参阅完整的 发行说明
  • 进程间:
    • 修复的错误
      • #127:boost interprocess 1.74 和 basic_managed_shared_memory 的静态断言失败。
  • 侵入式:
    • 修复的错误
      • PR#48: 修复 MSVC "条件内赋值" 警告。
      • PR#49: 修复空控制语句警告。
      • #52: BOOST_INTRUSIVE_BSR_INTRINSIC 中的无效类型转换。
  • 日志:
    • Bug 修复
      • 修正了当日志文件轮换时,在 text_file_backend 中生成目标文件名(基于 set_target_file_name_pattern 方法设置的模式)时使用的文件计数器。 (#125)
      • basic_sink_frontend 中的易变版本计数器替换为原子变量。 (#128)
      • asynchronous_sink 前端中,如果 run 方法是从用户的线程而不是前端生成的内部专用线程调用的,则解决了 flushrun 方法之间可能发生的冲突。 (#131)
    • 有关更多详细信息,请参见变更日志
  • 移动:
    • 修复的错误
      • #30: (void) C 风格转换是一种不可移植的抑制编译器警告的方式。
  • Mp11:
    • 添加了 mp_pairwise_fold (由 Barry Revzin 建议)
    • 移除了 mp_invoke (请使用 mp_invoke_q)
  • Optional:
    • boost::none 被声明为 constexpr
    • 修复了 问题 #78
  • Outcome:
    • 公告
      • 在经过一年和三个主要的 Boost 版本发布公告之后,这是 v2.1 分支的最终版本。从 Boost 1.76 开始,v2.2 分支将成为默认分支。此分支对 Outcome v2.1 有许多重大破坏性更改,详情请参阅文档。
    • 增强功能
      • ADL 发现的事件钩子已替换为策略指定的事件钩子。这是由于其脆弱性(如果有人更改了某些内容,钩子会悄悄地自行禁用)、编译器错误(编译器设置中的差异会导致发现错误的钩子,或仅发现部分钩子)以及最终用户难以使用它们。策略指定的事件钩子可以设置为默认为 ADL 发现的钩子以实现向后兼容:将 OUTCOME_ENABLE_LEGACY_SUPPORT_FOR 设置为小于 220 以启用模拟。
      • 改进了 OUTCOME_GCC6_CONCEPT_BOOL 的配置。较旧的 GCC 具有基于布尔值的概念语法,而较新的 GCC 符合标准。然而,何时使用旧语法和符合标准的语法的精确逻辑没有被很好地理解,这导致 Outcome 依赖于您传递给 GCC 的选项而无法编译。新的逻辑始终在 GCC 8 或更早版本上使用旧语法,否则,仅当 GCC 处于 C++ 20 模式或更高版本时才使用符合标准的语法。这有望解决 GCC 上的特殊构建失败问题。
    • Bug 修复
      • Boost.Outcome 现在应该可以通过定义 BOOST_NO_EXCEPTIONS 进行编译。感谢 Boost.Exception 的维护者 Emil 为我做出的更改,Boost.Outcome 现在应该可以在全局禁用 C++ 异常的情况下编译。您将无法使用 boost::exception_ptr,因为如果全局禁用了 C++ 异常,则无法包含它。
      • #236 在协程支持中,final_suspend() 不是 noexcept,尽管 C++ 20 标准要求如此。这已得到修复,但前提是您的编译器实现了 noop_coroutine。此外,如果 noop_coroutine 可用,我们将使用更高效的协程句柄返回变体 await_suspend(),这应显著提高代码生成和上下文切换性能。
  • Polygon:
    • event_comparison_typevertex_equality_predicate_typevoronoi_predicates 提供了 C++20 修复。(Glen Fernandes)
  • Preprocessor:
    • 当带有 __VA_OPT__ 支持的 C++20 模式下的可变数据为空时,可变大小已更正为 0。这也意味着在此 C++20 模式下,现在可以与空数组和列表以及可变数据相互转换。最终用户可以阅读“可变宏”主题的“C++20 可变宏支持”部分,以获取有关库中空可变数据的更多信息。
    • 添加了宏 BOOST_PP_IS_STANDARD(),用于识别当前使用的预处理器是否是符合 C++ 标准的预处理器。许多通常可以与库正常工作的预处理器需要各种内部解决方法,包括当前默认的 VC++ 预处理器,这些预处理器不被认为是符合 C++ 标准的预处理器。但是,包括 gcc、clang 和 VS2019 中新的但目前非默认的 VC++ 预处理器在内的大多数预处理器都是符合 C++ 标准的预处理器。
    • 对于符合 C++ 标准的预处理器,现在可以将 config/limits.hpp 中定义的许多限制更改为更大的值。最终用户应阅读“限制”主题以了解如何以及可以更改哪些限制。
    • 为了允许最大数量的 FOR 和 WHILE 迭代,对于符合 C++ 标准的预处理器,用户定义宏中的起始 'r' 和 'd' 迭代数字从 1 开始,而不是像以前的版本那样从 2 开始。如果这些迭代数字在用户定义宏中使用(它们可能不会),这可能是一个破坏性更改,但此更改对于修复在处理最大数字的数值/逻辑运算时的一些深奥的错误以及允许用户定义的宏被正确地调用最大次数是必要的。对于不符合 C++ 标准的预处理器,没有进行此更改,因为这些不符合 C++ 标准的预处理器通常具有不允许运行最大数量的循环结构的限制,并且认为不向那些更脆弱的预处理器引入可能的破坏性更改会更好。还认为,除了修复一些深奥的预处理器错误并提供可能的最大数量的用户定义宏调用之外,可以进行此更改,因为它从未记录起始的 'r' 和 'd' 迭代数字实际上是什么,而只是这些数字在每次迭代中递增。
    • 该库已升级为假设任何与该库一起工作的编译器都支持可变宏。表面上,这意味着该库现在是一个 C++11 及更高版本的库,但大多数主要编译器,包括 gcc、clang 和 VC++,只要在使用这些编译器之一时未启用对 C++98/C++03 的严格符合性,也支持 C++98/C++03 模式下的可变宏。
  • Rational:
    • 修复了 Rational 运算符,使其在新的 C++20 operator== 重写规则下不会中断。(Glen Fernandes)
  • Signals2:
    • 更正了 C++ 分配器模型支持,以修复 C++20 标准模式下的编译。(Glen Fernandes)
  • System:
    • 平台特定的头文件 windows_error.hpplinux_error.hppcygwin_error.hpp 发出弃用消息,并计划删除。
    • generic_category()system_category() 的旧名称发出弃用消息,并计划删除。
    • error_condition::failed 已弃用,并计划删除。error_conditionoperator bool() 已恢复到其旧含义 value() != 0。这样做是为了与 std::error_condition 兼容,因为预计下一个版本将进一步提高与 <system_error> 的互操作性。请注意,这不会影响 error_code::failed,它仍然有效。
    • 出于相同的原因,接受缓冲区的 error_condition::message 重载已弃用,并计划删除。请注意,这不会影响 error_code::message
  • uBLAS:
    • 更正了 C++ 分配器模型支持,以修复 C++20 标准模式下的编译。(Glen Fernandes 和 Conrad Poelman)
  • VMD:
    • VMD 数字解析已升级为支持最终用户更改预处理器库中的数字限制的功能。
    • 添加了宏 BOOST_VMD_IS_GENERAL_IDENTIFIER,以支持解析表示与 VMD 标识符语法匹配的预处理器令牌的输入,而无需将标识符注册为特定标识符。
  • Wave:
    • 添加了新的 C++20 令牌,包括宇宙飞船运算符 <=>
    • 修复的错误
      • #94: 修复重新扫描下 __LINE__ 和 __FILE__ 的不正确行为

测试过的编译器

Boost 的主要测试编译器是

  • Linux
    • Clang: 3.0, 4.0.1, 6.0.1
    • Clang, C++0x: 3.0
    • Clang, C++11: 3.0, 3.1, 3.2, 3.3, 3.4, 4.0.1, 6.0.1, 7.0.0, 8.0.0, 9.0.0, 10.0.0, 11.0.0
    • Clang, C++14: 3.5.0, 3.6.0, 3.7.1, 3.8.0, 3.9.1, 4.0.0, 4.0.1, 5.0.2, 6.0.1, 7.0.0, 8.0.0, 9.0.0, 10.0.0, 11.0.0
    • Clang, C++17: 5.0.2, 6.0.1, 7.0.0, 8.0.0, 9.0.0, 10.0.0, 11.0.0
    • GCC: 4.4.7, 4.5.3, 4.6.3, 5.4.0, 8.0.1
    • GCC, C++0x: 4.4.7
    • GCC, C++11: 4.7.3, 4.8.5, 4.9.4, 5.4.0, 6.4.0, 7.1.0, 8.0.1
    • GCC, C++14: 5.4.0, 5.5.0, 6.4.0, 7.1.0, 7.3.0, 8.0.1
    • GCC, C++17: 7.3.0, 8.0.1
    • Intel, C++14: 18.0
  • OS X
    • Apple Clang: 9.0.0, 9.1.0, 10.0.0, 11.0.0
    • Apple Clang, C++11: 9.0.0, 9.1.0, 10.0.0, 11.0.0
    • Apple Clang, C++14: 9.0.0, 9.1.0, 10.0.0, 11.0.0
    • Apple Clang, C++17: 9.1.0, 10.0.0, 11.0.0
    • Apple Clang, C++1z: 9.0.0
    • Apple Clang, C++2a: 10.0.0, 11.0.0
  • Windows
    • GCC: 3.4.5, 4.1.2, 4.2.4, 4.3.3, 4.4.0, 4.5.4
    • GCC, C++0x: 4.6.4
    • GCC, C++11: 4.7.3, 4.8.1, 4.9.3
    • GCC, C++14: 5.1.0, 5.2.0, 5.3.0, 6.1.0, 6.2.0, 6.3.0, 6.4.0
    • GCC, C++17: 7.1.0, 7.2.0, 7.3.0
    • Visual C++: 7.1, 8.0, 9.0, 10.0, 11.0, 12.0, 14.0, 14.1
  • FreeBSD
    • Clang: 4.0.0
    • Clang, C++11: 4.0.0
    • Clang, C++14: 4.0.0
    • Clang, C++1z: 4.0.0

Boost 的其他测试编译器包括

  • Linux
    • Clang: 3.0, 3.8.1, 3.9.1, 4.0.1, 5.0.2, 6.0.1
    • Clang, C++0x: 3.0
    • Clang, C++11: 3.0, 3.1, 3.2, 3.3, 3.4, 4.0.1, 6.0.1, 7.0.0, 8.0.0
    • Clang, C++14: 3.5.0, 3.6.0, 3.7.1, 3.8.0, 3.9.1, 4.0.0, 4.0.1, 5.0.2, 6.0.1, 7.0.0, 8.0.0
    • Clang, C++17: 5.0.2, 6.0.1, 7.0.0, 8.0.0
    • GCC: 4.4.7, 4.5.3, 4.6.3, 4.9.4, 5.4.0, 5.5.0, 8.0.1
    • GCC, C++0x: 4.4.7
    • GCC, C++11: 4.7.3, 4.8.5, 4.9.4, 5.4.0, 6.4.0, 7.1.0, 8.0.1
    • GCC, C++14: 5.4.0, 5.5.0, 6.3.0, 6.4.0, 7.1.0, 7.3.0, 8.0.1, 8.1.0
    • GCC, C++17: 7.3.0, 8.0.1
    • Intel, C++14: 18.0
  • OS X
    • Apple Clang: 9.0.0, 9.1.0, 10.0.0
    • Apple Clang, C++11: 9.0.0, 9.1.0, 10.0.0
    • Apple Clang, C++14: 9.0.0, 9.1.0, 10.0.0
    • Apple Clang, C++17: 9.1.0, 10.0.0
    • Apple Clang, C++1z: 9.0.0
    • Apple Clang, C++2a: 10.0.0
  • Windows
    • GCC: 3.4.5, 4.1.2, 4.2.4, 4.3.3, 4.4.0, 4.5.4
    • GCC, C++0x: 4.6.4
    • GCC, C++11: 4.7.3, 4.8.1, 4.9.3
    • GCC, C++14: 5.1.0, 5.2.0, 5.3.0, 6.1.0, 6.2.0, 6.3.0, 6.4.0
    • GCC, C++17: 7.1.0, 7.2.0, 7.3.0
    • Visual C++: 7.1, 8.0, 9.0, 10.0, 11.0, 12.0, 14.0, 14.1
  • FreeBSD
    • Clang: 4.0.0
    • Clang, C++11: 4.0.0
    • Clang, C++14: 4.0.0
    • Clang, C++1z: 4.0.0

致谢

Marshall Clow、Michael Caisse 和 Glen Fernandes 管理了此版本。