Boost C++ 库

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

版本 1.78.0

版本 1.78.0

2021年12月8日 格林尼治标准时间03:45

文档

下载
平台文件SHA256 哈希值
Unixboost_1_78_0.tar.bz28681f175d4bdb26c52222665793eef08490d7758529330f98d3b29dd0735bccc
boost_1_78_0.tar.gz94ced8b72956591c4775ae2207a9763d3600b30d9d7446562c552f0a14a63be7
Windowsboost_1_78_0.7z090cefea470bca990fa3f3ed793d865389426915b37a2a3258524a7258f0790c
boost_1_78_0.zipf22143b5528e081123c3c5ed437e92f648fe69748e95fa6e2bd41484e2986cc3
* 下载链接由 C++ 联盟 的拨款支持。

已知问题

这些是来自库作者的补丁,这些补丁在发布时发现太晚而无法修复。

  • 在某些情况下,Boost.Build 会静默跳过库头文件和二进制文件的安装,请参阅 #104
  • 在以 UWP 为目标时,Boost.Atomic 构建失败,请参阅 #54补丁

新增库

  • 没有新的库。

更新的库

  • Asio:
    • 添加了一个 io_uring 后端,可以选择将其用于所有 I/O 对象,包括套接字、计时器和 posix 描述符。
    • 增加了对文件的支持,新增了用于面向流和随机访问文件的新类。此功能目前支持 Windows 上的 I/O 完成端口和 Linux 上的 io_uring。
    • 增加了对 POSIX 和 Windows(当 I/O 完成端口可用时)上的可移植管道的支持。
    • 增加了对注册缓冲区的支持,在使用 io_uring 后端时进行了优化。
    • 增加了对通道的实验性支持,可用于将完成作为消息发送和排队。
    • 实现了对 experimental::coro 的改进。
    • 在使用 MSVC 运行时,禁用了Clang上的 aligned_alloc
    • 更改为使用更快的实现方式来处理 ip::network_v4::canonical()
    • 为常见用途添加了模板特化以缩短编译时间。
    • io_context 执行器的大小减小到单个指针。
    • 增加了 execution::any_executorany_io_executor 的小对象缓冲区大小。
    • 修复了禁用可变参数模板时的多签名处理问题。
    • 修复了与新版本GCCClang.
    • 的兼容性问题。修复了在 Solaris 上的编译问题。
    • 修复了使用 MSVC 构建时针对 Qt 定义宏的防御措施。
    • 改进了 ssl 设施发出的错误消息。
    • 修复了 bind_executor 与完成标记的兼容性问题。
    • 修复了定义 BOOST_ASIO_USE_TS_EXECUTOR_AS_DEFAULT 时的构建错误。
    • awaitable<> 添加了缺少的移动赋值运算符。
    • 修复了由于分配的内存对齐不正确导致在 MSVC 中使用协程时发生的访问冲突。
    • 修复了 experimental::parallel_group 中的一个清理问题,该问题发生在执行上下文关闭但并行操作仍处于挂起状态时。
    • 对并发提示的文档进行了澄清。
    • 添加了关于 C++20 协程错误处理技术的文档。
    • 修复了各种警告。
    • 有关更多详细信息,请参阅修订历史记录
  • 断言:
    • 添加了 source_location::to_string.
  • 原子:
    • 在 Android 上对非 IPC 等待和通知操作使用进程本地 futex 操作。
    • 增加了对仅定义 SYS_futex_time64 系统调用的 Linux 目标的支持,例如 riscv32。
    • 为 clang 8 上 32 位 x86 目标上 64 位类型的 std::alignment_of 的错误结果添加了解决方法。
    • 自 Mac OS 10.12、iOS 10.0、tvOS 10.0 或 watchOS 3.0 起,为 Darwin 系统上的等待和通知操作添加了 ulock 后端支持。
    • 在 Windows 上,更正了atomic-type::always_has_native_wait_notify与目标 Windows 8 或更高版本时相应的容量宏之间的差异。该库现在将直接使用公共头文件中的 WaitOnAddress 和相关 API,因此如果用户通过定义 BOOST_USE_WINAPI_VERSION_WIN32_WINNT 或类似宏来要求 Windows 8 或更高版本,则需要用户链接 synchronization.lib。该库会在支持自动链接的编译器(例如 MSVC)上自动链接。
    • 在提供清除填充位方法的编译器上,添加了对具有填充位类型的支持(联合除外)。gcc 11 和 MSVC 14.2(编译器版本 19.27)及更高版本以及支持类似内在函数的其他编译器都支持此功能。在不允许清除填充位的编译器上,仍然普遍不支持具有填充的类型,但 x86 目标上的 80 位 long double 除外。定义了一个新的 BOOST_ATOMIC_NO_CLEAR_PADDING 容量宏,以指示何时不支持清除填充。
    • atomic_refipc_atomic_ref 的初始化构造函数不再使用原子指令来清除引用对象中的填充位。这降低了原子引用构造的成本。
    • 对于枚举、类和浮点类型,atomicipc_atomic 的初始化构造函数现在是 constexpr。对于类和浮点类型,如果编译器支持 constexpr std::bit_cast,则构造函数是 constexpr,该类型没有填充字节,并且不需要填充来实现本机原子操作。
    • 根据 C++20,atomicipc_atomic 的默认构造函数现在执行包含对象的初始化值。对于没有用户定义的默认构造函数的类型,这意味着默认构造的原子将被初始化为零。
    • 添加了针对 AIX 上由汇编程序工具不支持数字标签引起的编译错误的解决方法。(PR#50)
    • 添加了针对 Visual Studio 2015 Update 3 之前的编译错误的解决方法。(#52)
    • 有关更多详细信息,请参阅更改日志
  • Beast:
    • 此维护更新带来了一些小的错误修复和更新的 CI 报告。
    • 修复了 zlib 实现中的安全漏洞 CVE-2016-9840。
    • 修复了 WebSocket permessage_deflate 实现。这将导致使用 Beast WebSockets 时压缩性能的提高。
    • 删除了测试流和测试框架对 RTTI 的依赖。您现在可以使用我们便捷的测试流来检查您的嵌入式异步通信代码!
    • 我们很想知道您或您的公司如何使用 Beast,请考虑在使用 Beast 的公司和个人列表中添加一个条目。
    • 有关更改的完整列表,请参阅完整的发行说明
  • 核心:
    • <boost/core/cmath.hpp> 中添加了一个通用实现,当定义了 BOOST_CORE_USE_GENERIC_CMATH 或平台未在 <cmath> 中提供必要的设施时启用。
    • 添加了 boost::core::type_name,这是一个实用函数,它以字符串形式返回类型的名称。
    • 添加了 boost::span,这是 C++20 的 std::span 的 C++11 实现(Glen Fernandes)。
  • 描述:
    • 添加了 has_describe_enumeratorshas_describe_baseshas_describe_members
    • 添加了 enum_to_stringenum_from_string
    • 添加了关系运算符和流插入运算符。
    • 添加了 descriptor_by_namedescriptor_by_pointer
  • DLL:
    • 修复了缺少的 #include,感谢 Denis Blank (PR#54)
    • 放弃 TravisCI,转而使用 GithubAction CI
  • 文件系统:
    • v4:如果路径以目录分隔符结尾,则 path::filenamepath::iterator 不再返回隐式尾随点(“.”)元素。而是返回一个空路径,类似于 C++17 std::filesystem。这也影响了根据迭代器或文件名定义的其他方法,例如 path::stempath::comparelexicographical_compare。例如,path("a/b/") == path("a/b/.") 不再成立。(#193)
    • v4: path::lexically_normal 不再生成尾随点(“.”)元素,并且在规范化路径中尾随点点(“..”)元素后省略目录分隔符。
    • v4: path 追加操作现在考虑追加路径中的根名称和根目录。如果追加的路径是绝对路径,或者存在根名称并且与源路径不同,则结果路径等效于追加的路径。如果存在根目录,则结果是基于源路径根名称的根目录和相对路径。否则,行为类似于 v3。(#214)
    • path::lexically_normal 现在将规范化路径的根名称中的目录分隔符转换为首选分隔符。
    • 优化了 path::assignpath::appendpath::concat 及其对应运算符的重载,避免了不必要的路径复制并减少了代码冗余。
    • 在 POSIX 系统上,如果 p 以根目录开头,则修复了 absolute(p, base) 返回带有根名称 base.root_name() 的路径。在这种情况下,p 已经是一个绝对路径,应该按原样返回。
    • 如果输入路径完全由点 (".") 和点点 ("..") 元素组成,则 create_directories 不再报告错误。该实现不再在内部使用递归,因此可以更好地防止极长路径上的堆栈溢出。
    • 在 Windows 上,remove 现在支持删除只读文件。该操作将尝试在删除之前重置只读属性。请注意,如果操作失败并且属性的原始值未能恢复,则这可能会导致只读属性保持未设置状态。 这也会影响 remove_all。(#216)
    • remove_all 现在在出错时返回 static_cast< uintmax_t >(-1),类似于 C++17 std::filesystem。
    • 修复了当用户代码包含 boost/filesystem/path.hpp 但不包含 boost/container_hash/hash.hpp 并且编译器设置为保留未使用的内联函数时,关于对 Boost.ContainerHash 函数的未解析引用的链接错误。 (#215)
    • 添加了针对 MSVC 和兼容编译器在发布版本中消除路径全局清理的解决方法。如果 Boost.Filesystem 共享库在进程中重复加载和卸载,这可能会导致内存泄漏。 (#217)
  • 几何图形:
    • 改进
      • PR#894 优化和重构 rtree 查询。
      • PR#913 在各种算法中支持 DynamicGeometry 和 GeometryCollection(目前未记录)。
      • PR#922 在距离计算中支持 DynamicGeometry 和 GeometryCollection(目前未记录)。
    • 已解决问题
      • #867 rtree 查询迭代器在使用最近邻谓词进行大 k 查询时性能较差。
      • #870 boost::geometry::self_turns 中的编译错误。
      • #896 在使用 BOOST_GEOMETRY_NO_ROBUSTNESS 的情况下,get_turns 中出现断言失败。
    • 错误修复
      • PR#906 在 macos-11 上使用 clang-12 时,缓冲区结果无效。
      • PR#921 使用 c++20(各种编译器)和 gcc-5 时的编译错误。
      • 集合操作和缓冲区的各种修复。
  • JSON:
    • 库的独立模式已弃用。
    • 允许外部库前向声明 value_tovalue_from
    • 修复了数字解析中的有符号整数溢出问题。
    • 在 MSVC 上添加了对 /Zc:implicitNoexcept- 的支持。
  • Lambda2:
    • 当第一个参数是流时,在 operator<<operator>> 中添加了特殊情况,以允许 std::cout << _1
    • 添加了 operator->*
    • 添加了 firstsecond
  • 日志:
    • 一般更改
      • 更新了对 char16_tchar32_tstd::codecvt 特化的检测,以兼容 C++17 及更高版本。 (PR#159)
      • 向进程间消息队列的接收方法添加了对 C++17 std::byte 类型的支持。
      • 在 Windows 上,当为 Windows 8 或更高版本构建库时,库将在版本命名空间中使用 nt62 标记来表示目标操作系统 ABI。例如,版本命名空间可以命名为 v2_mt_nt62。此名称将成为库导出的所有符号的一部分。在构建 Boost 和代码时,请始终使用 BOOST_USE_WINAPI_VERSION 宏来请求最低目标 Windows 版本。
      • 改进了 dump 流操纵器的 SSSE3 和 AVX2 实现的性能。
      • 添加了对 CMake 构建系统的支持。目前仅支持库构建,Boost.Build 仍用于运行测试。
    • 错误修复
      • 修复了 POSIX 系统中 reliable_message_queue::open_or_create 或等效构造函数中的竞争条件。多个线程或进程同时调用 open_or_create 并从同一队列发送或接收消息最终可能会损坏队列内容并可能导致进程崩溃。 (#162)
      • 如果定义了 BOOST_LOG_WITHOUT_SETTINGS_PARSERS,则添加了针对 b2 install 在 Windows 上由于缺少 boost_log_setup 库而失败的解决方法。 (#164)
    • 有关更多详细信息,请参阅更改日志
  • 数学:
    • 添加了对立方根的支持。
    • 添加了对各种标准库数学例程的 constexpr 版本的支持。
    • 添加了对贝塞尔多项式的支持。
    • 改进了最坏情况下的 tanh-sinh 集成性能。
    • 禁用了在集成例程中无意使用整数类型。
    • 当结果在 1 的 2ulp 范围内时,对 erf 近似值进行了次要更新。
    • 允许在没有原子整数的平台上使用伯努利代码。
    • 改进了非中心卡方分布的众数。
    • 改进了 <cstdfloat> 复值基本函数的某些边缘情况,请参阅 #507
  • 多索引容器:
    • 向基于键的索引添加了 contains(问题 #35)。
    • 向基于键的索引添加了 merge 操作。该功能在许多方面超出了(无序)关联容器的标准规范,最显著的是
      • 源索引可以是任何类型,包括非基于键的索引。
      • 提供了部分合并:例如,x.merge(y,first,last) 仅合并 [first,last) 范围内的 y 元素。
    • 先前版本的排序和随机访问索引的 splice 具有破坏性,即将元素复制插入到目标中,然后从源中删除。现在,splice 基于节点转移,就像基于键的索引中的 merge 一样,并且已类似地扩展为接受任何类型的源索引:实际上,splice 可以被视为基于键的索引中 merge 提供的相同功能的前端。出于向后兼容性的原因,如果源容器和目标容器具有不相等的分配器,则 splice 的破坏性行为将保留。
    • 已记录了索引迭代器类型仅依赖于 node_type 及其 multi_index_container 中索引的位置(哈希索引除外,其中唯一性/非唯一性也是一个依赖项)。这对 mergesplice 传输的元素的迭代器的有效性有影响。此属性是 C++ 标准邮件列表中所谓的SCARY 迭代器的变体。 SCARYness 目前(2021 年 8 月)并未强制用于标准容器。
    • 迭代器 SCARYness 现在也在安全模式下保留。
  • 多精度:
    • 重新设计 rational_adaptor 以去除对 Boost.Rational 的依赖并提高性能。
    • 修复了 type_traits 和 clang 的问题,请参阅 #383
    • 修复了错误的 Lehmer GCD 例程,请参阅 #370
    • 修复 mpc_complex 构造函数,以便有损转换是显式的,请参阅 #363
    • 更正了各种配置问题(Intel 内部函数使用和 Apple clang)。
    • 更正了无符号字符类型的某些 iostream 运算符。
    • 更正了 mpq_rational 到整数类型的转换,请参阅 #342
  • Nowide:
    • 重大更改:utf8_codecvt 的 UTF-32 特化的 do_unshift 现在正确返回 noconv 而不是 ok
    • 删除了 UTF-16 输出的 utf8_codecvt 中不必要的分支
    • 在 MSVC 中使用 utf8_codecvt 和 unicode 字符类型时抑制弃用警告
    • 修复在 filebuf 已分配内部缓冲区后设置自定义缓冲区 (setbuf) 时可能发生的 double-free
  • PFR:
    • 添加了缺少的 #include <memory> 用于包含 std::addressof
    • 修复了处理空聚合时出现的 -Wzero-length-array 警告
    • 修复了在 msvc 编译器 <= 1920 上的编译问题(感谢 Alexey Romanov,即 @alexey-romanov)
    • 添加了基本的 CMakeLists.txt 支持(感谢 @pdimov,即 Peter Dimov)
    • 多项文档改进,包括指向 https://github.com/apolukhin/pfr_non_boost 的链接
    • 添加了 misc/strip_boost_namespace.sh 脚本以移除 boost::BOOST_ 前缀
  • Predef:
    • 版本 1.13.1
    • 修复 "epoch" 的拼写错误。
    • 在 sparc.h 中添加缺少的括号(来自 tkoecker)。
    • 更新文档以使用 Rouge 代码样式和 Amber 常规样式。
  • 正则表达式:
    • **重大更改:** 根据 Perl 的行为,将 \B 更改为 \b 的反义。
    • 更改 w32_regex_traits.hpp 以不再包含 windows.h。
    • 修复了与模糊测试相关的问题 #151, #152, #153, #156
  • 系统:
    • error_code 添加了对源位置的支持。
    • 添加了 error_code::to_stringerror_condition::to_stringerror_code::what
    • system_error::what() 现在包含源位置(如果存在)。
    • 添加了 result<T, E = error_code>,一个持有值或错误的类,定义在 <boost/system/result.hpp> 中。
  • 实用工具:
    • 库文档已转换为 QuickBook 格式(感谢 Alan de Freitas,PR#79)。
  • Variant2:
    • 添加了 <boost/variant2.hpp>
    • 添加了 unsafe_get<I>
    • 添加了 visit_by_index
    • 添加了 operator<<

更新了工具

已测试的编译器

Boost 的主要测试编译器是

  • Linux
    • Clang: 3.4, 3.5, 3.6, 3.7, 3.8, 3.9, 12.0.0
    • Clang, C++11: 3.4, 11.0.0
    • Clang, C++14: 3.5, 3.6, 3.7, 3.8, 3.9, 4.0, 5.0, 12.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
    • Clang, C++20: 11.0.0, 12.0.0, 13.0.0
    • GCC: 4.6.3, 11
    • GCC, C++11: 4.7.3, 4.8.5, 11
    • GCC, C++14: 5.4.0, 6.4.0, 7.3.0, 8.0.1, 9.1.0, 11
    • GCC, C++17: 7.3.0, 8.0.1, 9.1.0, 11
    • GCC, C++20: 8.0.1, 9.1.0, 10, 11
  • OS X
    • Apple Clang: 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

致谢

Marshall Clow、Michael Caisse 和 Glen Fernandes 管理了此次发布。