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

更新的库

  • Asio:
    • 在 Windows 上启用对 UNIX 域套接字的支持。
    • ip::basic_resolver 添加了执行器转换构造和赋值。
    • 在多态执行器和(已弃用的)处理程序调用钩子之间添加了兼容性。
    • 添加了 experimental::as_single 完成令牌适配器。
    • 通过使用 _POSIX_VERSION 检测是否支持,在更多平台上添加了对 MSG_NOSIGNAL 的支持。
    • 添加了在 Windows 上使用 libpthread 编译的能力。
    • 为 Intel C++ 编译器添加了解决方法。
    • 添加了更多支持,用于检测和优化没有自定义执行器的处理程序。
    • 减少了 Windows 上定时器取消的锁争用。
    • 恢复了之前删除的空指针检查,因为它对性能有可衡量的影响。
    • 修复了执行器概念,以测试 const 限定的 execute()
    • 修复了在没有 RTTI 支持的构建中 any_executor 的支持。
    • 修复了 thread_pool 单元测试,使其在没有 RTTI 支持的情况下也能工作。
    • 修复了 C++20 协程与 Windows 上 clang 的兼容性。
    • 修复了一些与 Windows Runtime 的兼容性问题。
    • 修复了因添加 asio::query 引起的阴影名称警告。
    • 修复了 linux 上“相等表达式的逻辑 ‘或’”警告。
    • 修复了一个良性 switch fallthrough 警告。
    • 添加了缺少的 push/pop_options.hpp 包含。
    • 抑制了零作为空指针常量警告。
    • 修复了一个逗号运算符警告。
    • 更新了文档,以阐明何时select在 Windows 上使用 reactor。
    • 修复了由 any_executor 比较和转换引起的潜在歧义。
    • 在 MSVC 19.8 上添加了对非实验性 C++20 协程的检测。
    • 修复了与 uClibc 的兼容性。
    • 修复了在以旧版本 C++ 或不太符合标准的编译器为目标时,strand<> 对 Networking TS 执行器的适配。
    • 有关更多详细信息,请查阅 修订历史
  • Atomic:
    • 实现了地址查找算法的 SSE2 和 SSE4.1 版本,该算法用于内部锁池实现。这可能会提高在重度争用情况下等待和通知操作的性能。
    • 修复了在 AArch64 目标上,由于为带立即常量的按位(逻辑)运算生成了不正确的指令而可能导致的编译错误。(#41
  • Beast:
    • 此更新带来了错误修复,并支持来自 Boost.Asio 的 BOOST_ASIO_ENBALE_HANDLER_TRACKING 编译标志
    • 我们很想知道您或您的公司如何使用 Beast,请考虑将条目添加到 “使用 Beast 的公司和个人” 列表中。
    • 有关完整的更改列表,请参阅完整的 发行说明
  • Container:
    • 新的 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_vectorcontainer_rebind
      • #165: 共享库和 memory_resource 内联成员的链接错误。
      • PR#166: 修复版权标头中的编码错误。
      • PR#167: 错误:使用 GCC 4.4 时,msg 的地址将始终评估为 true 警告。
      • #169: 在 clang11 上构建 dlmalloc_ext_2_8_6.c 时出现大量警告。
  • Endian:
    • endian_arithmetic 不再继承自 endian_buffer
    • 当定义了 BOOST_ENDIAN_NO_CTORS 时,未对齐的 endian_bufferendian_arithmetic 是 C++03 POD,以启用 __attribute__((packed)) 的使用
  • Filesystem:
    • 新增: 添加了 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
  • Geometry:
    • 警告: 继 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 现代化的类型 traits 用法。
      • PR#759 MPL_ASSERT 已替换为标准 static_assert
      • PR#767 现代化的 tuple 用法。
    • 解决的问题
      • #716 悬空代理引用。
    • 错误修复
      • 集合操作和缓冲区中的各种修复。
  • GIL:
    • 突破性变更: 在下一个版本中,我们将放弃对 GCC 5 的支持。我们还可能将所需的最低 C++ 版本从 C++11 更改为 C++14。
  • Histogram:
    • 此更新带来了
      • 针对极端情况的错误修复
      • 小的文档改进
      • 修复了来自最新编译器的新警告以及针对 C++20 标准编译时的警告
    • 有关完整的更改列表,请参阅完整的 发行说明
  • Interprocess:
    • 修复的错误
      • #127: boost interprocess 1.74 和 basic_managed_shared_memory 的静态断言失败。
  • Intrusive:
    • 修复的错误
      • PR#48: MSVC “条件内赋值”警告修复。
      • PR#49: 修复空控制语句警告。
      • #52: BOOST_INTRUSIVE_BSR_INTRINSIC 中的无效转换。
  • Log:
    • 错误修复
      • 更正了在日志文件轮换时,在生成目标文件名(基于 set_target_file_name_pattern 方法设置的模式)时,将在 text_file_backend 中使用的文件计数器。(#125
      • basic_sink_frontend 中的 volatile 版本计数器替换为 atomic。(#128
      • asynchronous_sink 前端,如果 run 是从用户线程而不是前端生成的内部专用线程调用的,则解决了 flushrun 方法之间可能存在的冲突。(#131
    • 有关更多详细信息,请参阅 变更日志
  • Move:
    • 修复的错误
      • #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 上的极端情况构建失败问题。
    • 错误修复
      • 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 中定义的许多限制更改为 TU 的更高数量。最终用户应阅读“限制”主题,以了解如何以及可以更改哪些限制。
    • 对于符合 C++ 标准的预处理器,为了允许 FOR 和 WHILE 迭代的最大次数,用户定义的宏中的起始 '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 管理了此版本。