Boost
发布
arrow_drop_down
最新版本 (1.91.0)
2026 年 4 月 22 日
依赖项
本次发布新增了 6 个依赖项 (涉及 5 个库),并移除了 58 个依赖项 (涉及 55 个库)。
平台 文件 SHA256 哈希
Unix boost_1_91_0.tar.bz2 de5e6....264f5
boost_1_91_0.tar.gz 57343....3a463
Windows boost_1_91_0.7z 9446c....24e65
boost_1_91_0.zip 69c6f....40a77
Windows (二进制) boost_1_91_0-msvc-14.1-32.exe 56eef....ab442
boost_1_91_0-msvc-14.1-64.exe d6ca2....4f26a
boost_1_91_0-msvc-14.2-32.exe bc3cf....24ee7
boost_1_91_0-msvc-14.2-64.exe 73dff....e5ccd
boost_1_91_0-msvc-14.3-32.exe 484e1....c5f52
boost_1_91_0-msvc-14.3-64.exe b92b2....1bbc7
boost_1_91_0-msvc-14.5-32.exe d96cd....0c448
boost_1_91_0-msvc-14.5-64.exe f9e05....2faf5

版本 1.91.0

常规说明

  • StaticAssert 已合并至 Config 中。这包括了代码、测试和文档。为了向后兼容,git 子模块、CMake 和 b2 的 StaticAssert 目标仍然可用;这些目标只是简单地引入了对 Config 的依赖。最终,该子模块和目标将被移除。建议用户更新其对 StaticAssert 的依赖,将其替换为 Config。无需进行 C++ 代码修改。大多数 Boost 库已相应更新。

新库

  • Decimal:

    • 由 Matt Borland 和 Christopher Kormanyos 实现的 IEEE754 十进制浮点数。

更新的库

  • Any:

    • 修复了 CMake 中 import std 的检测问题。

    • 简化了 boost::anys::basic_any 的实现。

  • Asio

    • 增加了通过内联命名空间实现的二进制版本控制功能,允许在同一进程中并存多个 Asio 版本而不会产生符号冲突。

    • 将默认的 Windows 互斥锁实现从 CRITICAL_SECTION 改为 SRWLOCK

    • 增加了一个基于 std::atomic 的“精简”互斥锁实现,减小了 strand、socket 及其他描述符的状态大小。

    • 增加了对 Cygwin64 环境下编译的支持,包括在未定义 __USE_W32_SOCKETS 的情况下。

    • 增加了在包含 Asio 头文件前重写 BOOST_ASIO_DECL 的能力。

    • 修复了 NetBSD 上对 MSG_NOSIGNAL 的处理。

    • 修复了在不再支持链接 boost_system 的较新 Boost 版本下的构建问题。

    • 修复了与旧版 Android 上 musl libc 的兼容性。

    • 修复了旧版 Apple 平台上 std::aligned_alloc 的检测问题。

    • 修复了 MSVC 下 serial_port_base::character_size::store 的警告。

    • 在文档中澄清了 ip::multicast::outbound_interface 的 IPv4 与 IPv6 语义。

    • 更新了 TLS v1.3 上下文初始化,以正确检测 LibreSSL 支持。

    • 修复了与近期 OpenSSL 关于 X509 常量性 API 变更的兼容性。

    • 查阅 修订历史 获取更多详情。

  • Atomic:

    • 修复了 Apple 编译器下 PowerPC 上的 thread_pause 编译问题。(#79

  • Beast:

    • 修复了 inflate_with_eb 中的类型转换警告。

    • 对 chunk header 强制执行 8KB 合理性限制。

    • 使 OpenSSL 成为测试的可选依赖项。

    • 移除了对 Boost.StaticAssert 的依赖。

    • HTTP2-Settings 添加到 HTTP 字段枚举中。

  • Charconv:

    • 修复了 to_chars 中绝对值小于 2^64 的负 128 位整数溢出的问题。

  • Core:

    • 头文件 boost/is_placeholder.hpp 已从 Bind 移动到 Core。(#90

  • Describe:

    • 在 C++20 下,当包含类仍未完成时,描述的嵌套枚举现在可以工作。(感谢 Julien Blanc。)

    • enum_to_string 设置为 constexpr。(感谢 Julien Blanc。)

  • DynamicBitset:

    • operator-( const bit_iterator_base< Iter > & lhs, const bit_iterator_base< Iter > & rhs ) 添加了缺失的友元声明。

    • 修复了标准库实现中使用原始指针作为迭代器时的编译问题。

    • 修复了 from_block_range(),防止其在 bitset 的未使用部分设置任何位。

  • 异常:

    • 增加了可定制的序列化 API,内置支持 Boost.JSON 和 nlohmann/json。

  • Filesystem:

    • Boost.Filesystem 现在定义并使用其自己的平台宏 BOOST_FILESYSTEM_POSIX_APIBOOST_FILESYSTEM_WINDOWS_API。旧的 BOOST_POSIX_APIBOOST_WINDOWS_API 宏仍由 Boost.System 定义。Boost.Filesystem 将检查这两组宏是否同步,默认情况下,如果不一致将导致编译失败。通过将 BOOST_FILESYSTEM_ALLOW_SYSTEM_API_MISMATCH 定义为 1,可将编译错误降级为警告,定义为 2 则完全禁用该检查。注意,这种情况下 Boost.Filesystem 报告的错误代码值将与错误类别不匹配。

    • 在不支持 openat 及相关 API 的 POSIX 平台上,修复了当迭代器遇到悬空符号链接且禁用链接跟踪时 recursive_directory_iterator 增量报告的错误。

    • Cygwin 用户的破坏性变更。 该库现在将 Cygwin 视为 POSIX 平台。这会带来一些用户可见的结果,特别是:

      • path::value_type 类型已从 wchar_t 更改为 char。与其他 POSIX 平台一样,宽字符路径将使用 path::imbue 设置的区域设置转换为窄字符编码。注意,由于 Cygwin 在 Windows 之上运行,它也会在内部执行字符代码转换。配置正确的 Cygwin 环境区域设置非常重要。

      • 路径语法现在遵循 POSIX 约定,不支持 Windows 特有的路径(例如 UNC 路径、驱动器名称和路径前缀)。

      • 某些 Windows 特定的 API 部分将变得无法访问。由于重解析点(reparse points)是 Windows 特有功能,因此不会再为文件报告 file_type::reparse_file。重解析点的处理取决于 Cygwin 运行时的行为。

      • Cygwin 有其自己的符号链接实现,与原生 Windows 符号链接不兼容。Boost.Filesystem 现在将创建并操作 Cygwin 符号链接。

      • Boost.Filesystem 报告的错误代码现在将使用 POSIX errno 值。

    • 在 DragonFly BSD、NetBSD 和 Solaris 上,Boost.Filesystem 默认路径区域设置现在使用 UTF-8 进行路径字符编码。

    • 在 Linux 上,除了之前列入黑名单的文件系统外,对于 configfs、securityfs、cgroup 和 cgroup2 文件系统,现在使用 read/write 循环实现的 copy_filecopy

  • JSON:

    • valuestd::initializer_list 的构造方式更改为使用 value_from

  • LEAF:

    • 增加了可定制的序列化 API,内置支持 Boost.JSON 和 nlohmann/json。

    • 增加了在 Windows 上跨 DLL 边界使用 LEAF 错误对象的支持(默认关闭)。

    • 对内部 TLS API 进行了优化(例如 Win32、嵌入式)。

    • 改进了诊断系统和 on_error 的实现。

    • 改进了实现质量(例如更精确地使用 noexcept)。

    • 移除了已弃用的 verbose_diagnostic_info(被 diagnostic_details 取代)。

  • LexicalCast:

    • 实现了 C++20 模块 boost.lexical_cast 的初步版本。

  • Log:

    • 默认开启在 Cygwin 上构建进程间通信支持。

  • 数学:

    • non_central_f_distribution 添加了 find_non_centrality 查找函数。

    • non_central_t_distribution 添加了参数查找函数。

    • 添加了不完全伽马函数的对数函数 lgamma_q

    • 添加了下不完全伽马函数的对数函数 lgamma_p

    • pchip 添加了 domain() 函数。

    • 修复了逻辑分布中损坏的 CUDA 支持。

    • 修复了 Windows ARM64 平台上不正确的浮点特性。

    • 修复了大参数下 ibeta 结果不正确的问题。

    • 修复了 phi 参数为 N * PI / 2 时 ellint_2 不正确的问题。

    • 要求用户显式启用 CUDA,而不是根据 NVCC 的存在进行假设。

  • MultiIndex:

    • 破坏性变更:库接受或提供的所有类型列表(indexed_bytag、嵌套 typedef index_specifier_type_listindex_type_listiterator_type_listconst_iterator_type_list)不再基于 Boost.MPL,而是改为 Boost.Mp11 列表。因此,Boost.MultiIndex 不再依赖 Boost.MPL。预计大多数用户代码不会受到此变更的影响,但可以通过全局定义宏 BOOST_MULTI_INDEX_ENABLE_MPL_SUPPORT 来恢复以前的行为。对 Boost.MPL 的遗留支持可能会在未来被弃用并移除。

    • 破坏性变更:composite_key 及相关的类模板(composite_key_equal_tocomposite_key_comparecomposite_key_hash)已变为可变参数(之前模板参数的最大数量受 BOOST_MULTI_INDEX_LIMIT_COMPOSITE_KEY_SIZE 限制)。此变更对用户应该是透明的,唯一的区别是 composite_key::key_extractors 返回 std::tuple 而不是 boost::tuple(其他受影响的类模板同理)。

    • 移除了支持 C++11 以前编译器的内部变通方案和后备机制。

  • MSM:

    • 新特性 (backmp11)

      • 改进了对层次状态机中 deferred_events 属性的支持。(#173

      • 支持使用 deferred_events 属性进行条件延迟。(#155

      • 简化了函子签名。(#175

      • 将排队事件和延迟事件合并到单个事件池中。(#168

      • 对事件池中的事件进行小对象优化。(#172

      • 通过 flat_fold 分派策略提升运行时性能。(#180

      • 进一步优化编译,与 1.90 版本相比,编译时间缩短高达 25%,内存占用更低。

    • Bug 修复 (backmp11)

      • 在调用 on_entry(…​)on_exit(…​) 时,FSM 类型不正确。(#167

      • 完成事件触发过于频繁。(#166

      • 层次状态机中的转换选择不正确 (favor_compile_time)。(#200

      • state_machine 无法被移动。(#205

    • 破坏性变更 (backmp11):对事件池的直接访问权限从 public 更改为 protected,因为在库代码之外对其进行操作可能导致未定义行为。

  • Optional:

    • 对于具有完整 C++11 支持(包括“不受限制的联合体”和引用限定符)的编译器,将实现从对齐存储改为联合体存储。这启用了渐进的 constexpr 支持。

      • 在 C++11 中,一些构造函数和 const 限定的访问器在编译时上下文(即核心常量表达式)中变得可用,只要类型满足特定约束。

      • 在 C++14 中,即使是一些变异操作(那些不需要将 optional 从无值状态更改为有值状态的操作)对于协作类型也成为核心常量表达式。

      • 在 C++17 中,对于协作类型,所有构造函数(包括拷贝和移动)都成为核心常量表达式。

      此变更解决了问题 #132#143

    • 破坏性变更。 废弃了自定义 swap 的机制。几乎没人了解这个机制,且它从未被记录过。

    • 应用了一些细微更改,以更接近 std::optional 的接口。

      • 启用语法 o = {} 将 optional 对象置为无值状态。

      • 启用语法 o.value_or({}),它使用默认构造的 T

      • 构造 o = u(其中 ooptional<T> 类型,u 是可转换为 TU 类型)时,不再创建临时的 T

    • 增加了从 optional<T>&optional<T&> 的转换。这解决了 #142

    • none_t 现在是 std::equality_comparable,这意味着 none_toptional<T> 建模了概念 std::equality_comparable_with(对于 std::equality_comparable T),这意味着您可以对一系列 optional 对象执行 std::ranges::find(rng, boost::none)

    • 警告。 在未来版本中,我们打算在 optional 中引入范围接口,使得 std::ranges::range<optional<T>>true。这将在某些程序中影响重载决议,这些程序根据谓词(如 std::ranges::range)做出决策。例如,以下代码的行为将发生变化:

      template <typename T>
      void serialize(T const& v)
      {
        if constexpr (std::ranges::range<T>)
          serialize_as_range(v);
        else if constexpr (custom::is_optional_like<T>)
          serialize_as_optional(v);
        else
          serialize_as_value(v);
      }
  • PFR:

    • 添加了基于 C++26 反射的实验性实现。定义 BOOST_PFR_USE_CPP26_REFLECTION 宏为 1 以启用。

    • boost::pfr::for_each_field*() 函数现在可以很好地与有状态的访问者配合使用。

  • Random:

    • 修复了 binomial_distribution 中无符号类型被无意中不支持的问题。

  • Redis:

    • 添加了对 Sentinel 部署的内置支持,可通过 config::sentinel 配置。库自动处理主/从发现、错误检测和重连。(PR#345, PR#391, #237

    • 添加了 generic_flat_response,这是 flat_response 的高性能替代品,使用连续内存,且在稳态下执行零内存分配。衷心感谢 Nikolai Vladimirov 的 PR。(PR#340, PR#356, PR#358, PR#378, PR#383, #263

    • 服务器推送处理 进行了常规改进。

      • 添加了对订阅跟踪的支持,每次重连后自动恢复活跃订阅。可通过 request::subscriberequest::psubscriberequest::unsubscriberequest::punsubscribe 访问。(PR#375, #367

      • 添加了 push_parser,一个便于解析 PubSub 相关消息的视图。(PR#390, #349

      • connection::async_receiveconnection::receive 现已 弃用。用户应优先使用 async_receive2,它允许更快的批处理。(PR#381, PR#340, #331

      • consume_one 现已 弃用。用户应优先使用 generic_flat_response::clear。详情请见 PubSub 示例。

      • 改进了文档和示例。

    • config::usernameconfig::passwordconfig::client_nameconfig::database_index 现已 弃用。用户应优先使用 config::setup。添加了 request::hellorequest::hello_setname 以简化设置请求的构建。(PR#392

    • 调整了日志消息级别以提高相关性:level::error 用于配置和网络错误,level::info 用于成功的连接尝试,level::debug 用于冗长输出。(PR#389, #395

    • 添加了 request::append() 以连接请求对象。(PR#342, #341

    • 修复了当传入包含 std::tuple 元素的范围时,request::push_range 生成无效命令的问题。(PR#363, #360

    • 从公共头文件中移除了 <ostream> 以减轻负担。(PR#364, #361

  • Stacktrace:

    • 移除了对可能不兼容运行时的编译时检查。因此不再产生误报,from_exception 功能可以直接开箱即用。极少数不兼容/泄露运行时的情况现在会在运行时报告。

    • 在 cygwin 上禁用 from_exception。(PR#219)。衷心感谢 David McFarland 的 PR!

    • 移除了 has_addr2line 与 C 标准库的链接,以简化使用非系统默认 `libstdc.so` 的构建。

  • 系统:

    • operator|(result<T&>, U) 的返回类型已更改为非引用。

    • 支持 r & f 中的成员指针(通过使用 boost::compat::invoke)。

    • 即使该库是仅头文件库,现在也会安装 CMake 配置文件。这避免了破坏包含 find_package(Boost COMPONENTS system …​) 的第三方 CMakeLists.txt 文件。

    • error_code 在 C++20 及更高版本下现在更加 constexpr

    • result 添加了 unsafe_value

    • result<>::operator*result<>::operator-> 更改为在 !has_value() 时抛出异常,而不是作为前提条件。旧行为现在称为 unsafe_value()

    • 添加了 boost/system/unwrap_and_invoke.hpp

  • Test:

    • 为 GCC < 10 下 std::optional 的正确比较添加了友元运算符。

  • TypeIndex:

    • 优化了 C++20 开始的 CTTI 类型比较。

    • ctti_type_index::name() 现在在 C++14 及更新的标准中默认返回易读的值。减小了库二进制文件的大小。

  • Unordered:

    • 修复了并发容器中范围插入的返回值。(PR#344

  • UUID:

    • boost/uuid/uuid_io.hpp 添加了 from_chars

    • string_generator 添加了 noexceptoperator() 重载。

    • string_generator 现在除了 charwchar_t 外,还支持 Unicode 字符类型。

    • 大多数 uuid 访问器、操作和 to_chars 现在在可能的情况下都是 constexpr(在 C++14 及更高版本以及较新的编译器上)。

    • 添加了 to_chars 的 SIMD 实现,在 UUID 格式化方面可提供高达 5.5 倍的性能提升。(Andrey Semashev)

    • 添加了 from_chars 的 SIMD 实现,在 UUID 解析方面可提供高达 13 倍的性能提升。(Andrey Semashev)

    • boost/uuid/uuid_io.hpp 添加了 uuid_from_string

    • 添加了一个专用的 invalid_uuid 异常类,派生自 std::runtime_error 以保持向后兼容。

  • URL:

    • 功能

      • 所有解析函数在 C++20 下现在都是 constexpr,实现了编译时 URL 解析和验证。(PR#976

      • 为查询容器添加了 get_or,在键不存在时返回默认值。(PR#953

      • 添加了独立的 decodedecoded_size 自由函数。(PR#952

      • 添加了用户提供的 RangeRulegrammar::range 的支持,允许自定义语法规则。(PR#950

      • 为所有视图类型专门化了 std::ranges::enable_borrowed_range。(PR#966

      • token_rule_t 添加了 EBO 和默认构造。(PR#964

      • 添加了用于段(segments)的 natvis 可视化工具。(PR#962

    • 性能

      • 将内部 URL 偏移量从 size_t 更改为 uint32_t,减少了 64 位平台上的对象大小。(PR#969

    • 修复

      • 修复了因 dot-dot 取消引起的 normalize_path 歧义。(PR#986

      • parse_query 添加了针对空 string_view 输入的保护。(PR#949

      • 修复了 params_iter_impl::decrement() 中包含 = 的值的解码大小。(PR#978

      • 修复了 decode_view::remove_prefix/remove_suffix 断言。(PR#978

      • 修复了 decode_viewpct_string_view::operator*() 的完整性。(PR#963

      • 示例路由器现在仅支持移动。(PR#959

      • 修复了 GCC 在 tuple_rule 中的误报 -Wmaybe-uninitialized。(PR#981

      • 由 Laurel Lye Systems Engineering 进行了安全审查:进行了三轮评估,确认了 21 个修复,并添加了公共接口边界测试和模糊测试。(PR#982, PR#988

    • 文档

      • 添加了设计原理页面。(PR#987

      • 记录了加号模式约定。(PR#970

      • 移除了遗留的 QuickBook 文档。

  • Variant2:

    • holds_alternative<T>get<T> 已放宽,不再要求 T 在可选方案列表中恰好出现一次。现在只需至少出现一次即可。

测试的编译器

Boost 的主要测试编译器为:

  • Linux

    • Clang, C++03: 3.4, 3.5, 3.6, 3.7, 3.8, 3.9, 12.0.0, 13.0.0, 14.0.0, 15.0.0

    • Clang, C++11: 3.4, 11.0.0, 13.0.0, 14.0.0, 15.0.0

    • Clang, C++14: 3.5, 3.6, 3.7, 3.8, 3.9, 4.0, 5.0, 12.0.0, 13.0.0, 14.0.0, 15.0.0

    • Clang, C++17: 6.0.1, 7.0.0, 8.0.0, 9.0.0, 10.0.0, 11.0.0, 12.0.0, 13.0.0, 14.0.0, 15.0.0

    • Clang, C++20: 11.0.0, 12.0.0, 13.0.0, 14.0.0, 15.0.0

    • GCC, C++03: 4.6.3, 11, 12

    • GCC, C++11: 4.7.3, 4.8.5, 11, 12

    • GCC, C++14: 5.4.0, 6.4.0, 7.3.0, 8.0.1, 9.1.0, 11, 12

    • GCC, C++17: 7.3.0, 8.0.1, 9.1.0, 11, 12

    • GCC, C++20: 8.0.1, 9.1.0, 10, 11, 12

  • OS X

    • Apple Clang, C++03: 11.0.3

    • Apple Clang, C++11: 11.0.3

    • Apple Clang, C++14: 11.0.3

    • Apple Clang, C++17: 11.0.3

    • Apple Clang, C++20: 11.0.3

  • Windows

    • Visual C++: 10.0, 11.0, 12.0, 14.0, 14.1, 14.2, 14.3

致谢

Marshall Clow, Glen Fernandes 和 Ion Gaztañaga 管理了本次发布。