Boost C++ 库

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

版本 1.78.0

版本 1.78.0

2021 年 12 月 8 日 03:45 GMT

文档

下载
平台文件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 的改进。
    • 禁用了 aligned_allocclang当使用 MSVC 运行时。
    • 更改为使用更快的实现用于 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 协程的错误处理技术的文档。
    • 修复了各种警告。
    • 有关更多详细信息,请查阅 修订历史
  • Assert:
    • 添加了 source_location::to_string
  • Atomic:
    • 在 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)
    • 有关更多详细信息,请参阅 changelog
  • Beast:
    • 此维护更新带来了小的错误修复和更新的 CI 报告。
    • 修复了 zlib 实现中的安全漏洞 CVE-2016-9840。
    • 修复了 WebSocket permessage_deflate 实现。这应该在使用 Beast WebSockets 时提高压缩性能。
    • 删除了测试流和测试框架对 RTTI 的依赖。您现在可以使用我们方便的测试流来检查您的嵌入式异步通信代码!
    • 我们很想知道您或您的公司如何使用 Beast,请考虑将条目添加到 使用 Beast 的公司和个人 列表中。
    • 有关更改的完整列表,请参阅完整的 发行说明
  • Core:
    • <boost/core/cmath.hpp> 添加了一个通用实现,当定义了 BOOST_CORE_USE_GENERIC_CMATH 或当平台未在 <cmath> 中提供必要的功能时启用。
    • 添加了 boost::core::type_name,一个实用程序函数,它以字符串形式返回类型的名称。
    • 添加了 boost::span,C++11 实现的 C++20 的 std::span (Glen Fernandes)。
  • Describe:
    • 添加了 has_describe_enumerators, has_describe_bases, has_describe_members
    • 添加了 enum_to_string, enum_from_string
    • 添加了关系和流插入运算符。
    • 添加了 descriptor_by_name, descriptor_by_pointer
  • DLL:
    • 修复了缺失的 #include,感谢 Denis Blank (PR#54)
    • 放弃 TravisCI 转而使用 GithubAction CI
  • Filesystem:
    • v4: 如果路径以目录分隔符结尾,path::filenamepath::iterator 不再返回隐式尾随点 ("。") 元素。相反,返回一个空路径,类似于 C++17 std::filesystem。这也影响了其他根据迭代器或文件名定义的方法,例如 path::stem, path::comparelexicographical_compare。例如,path("a/b/") == path("a/b/.") 不再成立。 (#193)
    • v4: path::lexically_normal 不再生成尾随点 ("。") 元素,并在规范化路径中的尾随点点 ("..") 元素之后省略目录分隔符。
    • v4: path 追加操作现在考虑追加路径中的根名称和根目录。如果追加路径是绝对路径,或者根名称存在且与源路径不同,则结果路径等同于追加路径。如果根目录存在,则结果是根目录和相对于源路径的根名称重新定位的相对路径。否则,行为类似于 v3。 (#214)
    • path::lexically_normal 现在将目录分隔符转换为规范化路径的根名称中的首选分隔符。
    • 优化了 path::assign, path::append, path::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)
  • Geometry:
    • 改进
      • PR#894 rtree 查询的优化和重构。
      • PR#913 各种算法中的 DynamicGeometry 和 GeometryCollection 支持(目前未文档化)。
      • PR#922 距离中的 DynamicGeometry 和 GeometryCollection 支持(目前未文档化)。
    • 已解决的问题
      • #867 对于大的 k,rtree 查询迭代器与最近谓词的性能较差。
      • #870 boost::geometry::self_turns 中的编译错误。
      • #896 在 BOOST_GEOMETRY_NO_ROBUSTNESS 的情况下,get_turns 中的断言失败。
    • Bugfixes
      • PR#906 在 macos-11 上使用 clang-12 时,buffer 的结果无效。
      • PR#921 使用 c++20(各种编译器)和 gcc-5 的编译错误。
      • 集合操作和 buffer 中的各种修复。
  • JSON:
    • 该库的独立模式已弃用。
    • 允许外部库转发声明 value_tovalue_from
    • 修复了数字解析中的有符号整数溢出。
    • 添加了对 MSVC 上的 /Zc:implicitNoexcept- 的支持。
  • Lambda2:
    • 在第一个参数是流时,在 operator<<operator>> 中添加了特殊情况,以允许 std::cout << _1
    • 添加了 operator->*
    • 添加了 first, second
  • Log:
    • 常规更改
      • 更新了对 C++17 及更高版本的兼容性,检测 std::codecvtchar16_tchar32_t 的特化。 (PR#159)
      • 为进程间消息队列的接收方法添加了对 C++17 std::byte 类型的支持。
      • 在 Windows 上,当为 Windows 8 或更高版本构建库时,该库将在版本命名空间中使用 nt62 标签来表示目标 OS ABI。例如,版本命名空间可以命名为 v2_mt_nt62。此名称将是库导出的所有符号的一部分。在构建 Boost 和您的代码时,一致地使用 BOOST_USE_WINAPI_VERSION 宏来请求最低目标 Windows 版本。
      • 提高了 dump 流操作符的 SSSE3 和 AVX2 实现的性能。
      • 添加了对 CMake 构建系统的支持。目前仅支持库构建,Boost.Build 仍用于运行测试。
    • Bug fixes
      • 修复了在 POSIX 系统上 reliable_message_queue::open_or_create 或等效构造函数中的竞争条件。多个线程或进程并发调用 open_or_create 并从同一队列发送或接收消息可能会导致队列内容损坏,并可能导致进程崩溃。 (#162)
      • 如果定义了 BOOST_LOG_WITHOUT_SETTINGS_PARSERS,则添加了 b2 install 因缺少 boost_log_setup 库而在 Windows 上失败的解决方法。 (#164)
    • 有关更多详细信息,请参阅 changelog
  • Math:
    • 添加了对立方根的支持。
    • 为各种标准库数学例程添加了对 constexpr 版本的支持。
    • 添加了对 Bezier 多项式的支持。
    • 提高了最坏情况下的 tanh-sinh 积分性能。
    • 禁用了在积分例程中意外使用整数类型。
    • 当结果在 1 的 2ulp 范围内时,对 erf 近似进行了小更新。
    • 允许在没有原子整数的平台上使用 Bernoulli 代码。
    • 改进了非中心卡方分布的模式。
    • 改进了 <cstdfloat> 复值初等函数的某些边缘情况,请参阅 #507
  • Multi-index Containers:
    • 为基于键的索引添加了 contains (issue #35)。
    • 为基于键的索引添加了 merge 操作。该功能在许多方面超越了(无序)关联容器的标准规范,最值得注意的是
      • 源索引可以是任何类型,包括非基于键的索引。
      • 提供了部分合并:例如,x.merge(y,first,last) 仅合并 y 中 [first,last) 范围内的元素。
    • 先前版本的 splice 对于序列和随机访问索引是破坏性的,即元素被复制插入到目标中,然后从源中擦除。现在,splice 基于节点传输,就像基于键的索引中的 merge 一样,并且已类似地扩展为接受任何类型的源索引:实际上,splice 可以被视为基于键的索引中 merge 提供的相同功能的前端。出于向后兼容性的原因,在源容器和目标容器具有不相等的分配器的情况下,splice 的破坏性行为已保留。
    • 索引迭代器类型仅依赖于 node_type 和索引在其 multi_index_container 中的位置(哈希索引除外,其中唯一性/非唯一性也是依赖项)这一事实已被记录在案。这对通过 mergesplice 传输的元素的迭代器的有效性有影响。此属性是 C++ 标准邮件列表中所谓的 SCARY iterators 的变体。SCARY 性质目前(2021 年 8 月)不是标准容器的强制要求。
    • 迭代器 SCARY 性质现在也在 安全模式 中保留。
  • Multiprecision:
    • 重构 rational_adaptor 以消除对 Boost.Rational 的依赖并提高性能。
    • 修复了 type_traits 和 clang 的问题,请参阅 #383
    • 修复了有缺陷的 Lehmer's GCD 例程,请参阅 #370
    • 修复了 mpc_complex 构造函数,以便有损转换是显式的,请参阅 #363
    • 纠正了各种配置问题(Intel 内在函数使用和 Apple clang)。
    • 纠正了一些用于无符号字符类型的 iostream 运算符。
    • 纠正了 mpq_rational 到整数类型的转换,请参阅 #342
  • Nowide:
    • 重大更改:UTF-32 特化的 utf8_codecvtdo_unshift 现在正确返回 noconv 而不是 ok
    • 删除了 UTF-16 输出的 utf8_codecvt 中不必要的分支
    • 在使用带有 unicode 字符类型的 utf8_codecvt 时,禁止 MSVC 中的弃用警告
    • 修复了在 filebuf 已分配内部缓冲区后设置自定义缓冲区 (setbuf) 时可能发生的双重释放
  • PFR:
    • 为包含 std::addressof 添加了缺失的 #include <memory>
    • 修复了处理空聚合时的 -Wzero-length-array 警告
    • 修复了 msvc 编译器 <= 1920 上的编译(感谢 Alexey Romanov aka @alexey-romanov)
    • 添加了基本的 CMakeLists.txt 支持(感谢 @pdimov aka 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 常规样式。
  • Regex:
    • 重大更改: 将 \B 更改为与 \b 相反,与 Perl 行为一致。
    • 更改 w32_regex_traits.hpp,以便不再包含 windows.h。
    • 修复了与模糊测试相关的问题 #151, #152, #153, #156
  • System:
    • error_code 添加了对源位置的支持。
    • 添加了 error_code::to_string, error_condition::to_string, error_code::what
    • system_error::what() 现在包含源位置(如果存在)。
    • 添加了 result<T, E = error_code>,一个类,它包含值或错误,在 <boost/system/result.hpp> 中定义。
  • Utility:
    • 库文档已转换为 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 管理了此版本。