Boost C++ 库

……世界上最受推崇和设计精良的 C++ 库项目之一。 Herb SutterAndrei AlexandrescuC++ 编码规范

版本 1.79.0

版本 1.79.0

2022年4月13日 14:22 格林尼治标准时间

文档

下载
平台文件SHA256 哈希值
Unixboost_1_79_0.tar.bz2475d589d51a7f8b3ba2ba4eda022b170e562ca3b760ee922c146b6c65856ef39
boost_1_79_0.tar.gz273f1be93238a068aba4f9735a4a2b003019af067b9c183ed227780b8f36062c
Windowsboost_1_79_0.7z6c97cf4f4a0eb00ed776c88065ab3f59e183fa5e65f6464ff94f92328352d9d6
boost_1_79_0.zip3634f9a85759311f321e587eace21799c0d0c946ff933e477a2f98885c54bbff
* 下载链接由 C++ 联盟 的资助支持。

已知问题

这些是库作者提供的补丁,发现得太晚,无法在发行版中修复。

  • Boost.JSON array::erase 可能导致段错误,请参见 #692补丁

新增库

  • 无新增库。

更新的库

  • Asio:
    • 添加了 bind_allocator
    • 添加了 file_base::sync_all_on_write 标志。
    • 添加了缺失的 basic_file::release() 实现。
    • 为信号集添加了每个操作的取消支持。
    • recycling_allocator 作为公共接口的一部分公开。
    • 为许多函数添加了 nodiscard 属性。
    • 添加了 OpenSSL 3.0 兼容性。
    • 添加了将现有 SSL* 采用到 ssl::stream<> 中的支持。
    • 在所有构建配置中启用了 executor_work_guard<>
    • 在使用 clang 时启用了可移动套接字 iostream。
    • 修复了 bind_cancellation_slotbind_executor 与旧版完成标记的兼容性。
    • 修复了 associatorexperimental::appendexperimental::prepend 特化。
    • 修复了 associated_allocator 主模板。
    • 修复了io_uring套接字的 async_receive_from 和文件的 write_some_at 实现。
    • 修复了io_uring特性检测。
    • 修复了 experimental::coro 的每个操作取消。
    • 修复了 experimental::promise 的类型擦除完成处理程序中的内存管理。
    • 修复了 operator= 的移动实现 ssl::stream
    • 修复了 any_io_executor 的实现,使其在同时定义 BOOST_ASIO_USE_TS_EXECUTOR_AS_DEFAULTBOOST_ASIO_SEPARATE_COMPILATION 时也能工作。
    • 修复了使用 sockatmark() 系统调用时 basic_socket::at_mark() 的实现。
    • 更改了回收分配器,使其使用默认对齐方式作为分配的最小对齐方式。
    • 添加了解决 Apple clang 的协程代码生成错误的变通方法。
    • 在 Windows 上,更改了文件支持,以便使用与 fopen() 相同的共享模式打开文件。
    • 在 Linux 上,修复了 UNIX 域套接字实现,以正确处理 EAGAIN
    • 修复了 experimental::basic_channel::reset()experimental::basic_concurrent_channel::reset() 的实现。
    • 修复了 experimental::promise 中潜在的未定义行为。
    • 更改了 co_spawn 实现,以便在某些情况下通过执行程序分派取消信号。
    • 修复了各种头文件包含问题。
    • 修复了各种警告。
    • 许多文档增强,包括
      • 添加了 Asio 异步模型的概述。
      • 根据异步模型重新编写了参考和要求文档。
      • 更新了 dispatch()post()defer() 的文档。
      • 为串口记录了每个操作的取消。
      • 阐明了为分配器做出的非并发保证。
      • io_context 参考文档恢复为使用 executor_work_guard
      • make_strand()make_work_guard()ip::address_v4ip::address_v6experimental::basic_channelexperimental::basic_concurrent_channel 添加了更详细的参考文档。
      • 重新排列并扩展了概述文档,以涵盖最近添加的功能。
    • 添加了一个 C++11 示例,演示了通过本地套接字传递文件描述符。
    • 添加了 C++14 示例,演示了在异步操作中包装基于回调的 API。
    • 请参阅 修订历史 以获取更多详细信息。
  • 断言:
    • source_location().file_name()source_location().function_name() 现在返回 "" 而不是 "(unknown)"
    • 添加了从 std::source_locationsource_location 构造函数。
    • 更改了 BOOST_CURRENT_LOCATION 以更紧密地匹配 std::source_location::current() 的行为,例如在顶层或作为默认函数参数可用。
  • 原子:
    • 修复了通用 Windows 平台 (UWP) 的编译。(#54)
    • 添加了 BOOST_ATOMIC_NO_DARWIN_ULOCK 配置宏。此宏会影响 Darwin 系统上的编译,并禁用基于 ulock 的等待和通知操作的实现。这可能有助于符合 Apple App Store 的要求。(#55)
  • Beast:
    • 添加了文件主体测试的缺失包含。
    • 修复了失败时的 WebSocket 握手响应。
    • 修复了 file_posixfile_win32 的打开追加模式。
    • 修复了在 Windows 上使用追加/追加现有标志打开文件。
    • 修复了 clang-cl 为 file_win32file_stdio 处理 UTF8 路径。
    • 为 drone CI 添加了 ARM64 构建。
    • 修复了 async_base 文档链接。
    • 添加了以追加/追加现有模式打开文件的测试。
    • 更新了 CI,包括 gcc 11、clang 12、msvc 14.3。
    • 为 CMake 工作流程添加了单独的测试。
    • 我们非常想知道您或您的公司如何使用 Beast,请考虑向 使用 Beast 的公司和个人 列表添加条目。
    • 查看完整的 发行说明 以获取更改的完整列表。
  • 核心:
    • 使 boost::pointer_traits 对 SFINAE 友好,解决了 LWG3545。(Glen Fernandes)
    • 添加了 boost::allocator_traits,它使用单独的分配器访问特性。此实现支持 C++03 及更高版本。(Glen Fernandes)
    • 更新了分配器访问特性,以在 C++03 中支持 C++11 分配器模型的大部分。(Glen Fernandes)
    • boost/iterator.hpp 已弃用,将在未来的版本中删除。此头文件定义了 boost::iterator 模板,它等效于 <iterator> 头文件中的 std::iterator。但是,由于 std::iterator 本身在 C++17 中已弃用,因此建议用户从代码中删除 boost::iteratorstd::iterator 的使用。
    • 添加了 boost::core::verbose_terminate_handler,这是一个实用程序函数,旨在传递给 std::set_terminate,它会将有关未捕获异常的信息打印到 stderr
  • 描述:
    • BOOST_DESCRIBE_STRUCT 中启用了联合,并更新了示例以检查 std::is_union<T>
    • 添加了定义 fmtlib 类格式化程序的示例。
    • 添加了定义 fmtlib 枚举格式化程序的示例。
    • 添加了打印指向成员的指针的示例。
  • 文件系统:
    • v3: path::replace_extension 现在根据 path::extensionv3 定义而不是 v4 定义工作。
    • 修复了使用可转换为 path 或兼容字符串类型的参数的路径追加和连接运算符的编译。(#223)
    • 在支持 fdopendirO_NOFOLLOW 的 POSIX 系统和 Windows 上,remove_all 现在受到 CVE-2022-21658 的保护。此漏洞是一个竞争条件,允许第三方进程将正在由 remove_all 并发处理的目录替换为目录符号链接,并导致 remove_all 跟踪符号链接并删除链接目录中的文件,而不是删除符号链接本身。(#224)
    • 在 Windows 系统中,`remove` 和 `remove_all` 的实现中,会在操作系统支持的情况下(Windows 10 1709 及更高版本),使用 POSIX 语义进行文件删除。当支持 POSIX 语义时,文件一旦被标记为删除,其文件名就会立即从文件系统命名空间中移除,即使该文件仍然处于打开和使用状态。使用传统的 Windows 语义时,文件名会保留在文件系统命名空间中,直到文件的最后一个文件句柄被关闭,这允许打开被标记为删除的文件,并阻止创建同名的新的文件。(#216)
    • 在 Windows 系统中,`remove` 和 `remove_all` 现在支持删除只读目录。之前已经添加了删除只读非目录文件的支持。
    • 在 Windows 系统中,`directory_iterator` 的内部实现已被重新设计,以更好地利用现代 Windows API,这可能会提高处理符号链接时的性能。
    • 在 Windows 系统中,如果可能,尽早初始化内部 WinAPI 函数指针,以允许在全局构造函数中调用 Boost.Filesystem 操作。这仅在 MSVC、GCC、Clang 和兼容的编译器上受支持。
    • 在 Windows 系统中,如果要调整大小的文件已打开,`resize_file` 不应该再失败并返回错误。
    • 在 Android 11.0(API 版本 30)之前的版本上,禁用了 `statx` 系统调用的使用。该系统调用被 seccomp 列入黑名单,并导致运行时进程终止。(#229)
    • 已弃用:`boost/filesystem/string_file.hpp 头文件已弃用,将在未来的版本中移除。该头文件不再默认包含在 `boost/filesystem.hpp 中。建议用户自行实现此功能或迁移到其他实现。
    • 已弃用:Windows CE 支持已弃用,将在未来的版本中移除。多年来 Windows CE 一直未经测试,并且可能无法正常工作。
  • 几何:
    • 重大更改
      • PR#977 默认情况下关闭重新缩放功能。这避免了集合操作和缓冲区中的许多相关错误。
    • 改进
      • PR#923 为笛卡尔点/几何体添加了 `closest_points` 算法。
      • PR#939 为其他坐标系和几何组合(不包括框)添加了 `closest_points` 算法。
      • PR#961 添加了 Web 墨卡托投影。
      • PR#966 在简化过程中使用了更高效的笛卡尔距离策略。
    • 已解决的问题
      • #956 简化算法的结果闭合不正确。
      • #962 由于负载因子导致 R 树反序列化出现运行时错误。
      • #971 在 ARM 平台上使用长双精度浮点数影响 R 树插入时间。
    • 错误修正
      • PR#936 包含极点的多边形的包络。
      • PR#948 近子午线段的球面和地理包络。
      • PR#974 用于 NaN 坐标的球面归一化实用程序。
      • 集合操作和缓冲区中的各种修复。
  • 整数:
    • 优化了 `integer_log2` 的实现,在内部使用位运算。这允许使用大多数现代 CPU 上可用的位指令。(#31)
  • IO:
    • 添加了 `boost::io::basic_nullbuf`(一个空流缓冲区)和 `boost::basic_onullstream`(一个空输出流)(Glen Fernandes)。
  • 迭代器:
    • 在 `counting_iterator` 中,添加了对某些目标平台上 gcc 和 clang 及兼容编译器支持的内置 128 位整数类型的支持。
    • 消除了 gcc 关于 `counting_iterator` 中已弃用的隐式复制赋值运算符的警告。
  • JSON:
    • 库的独立模式已被移除。希望继续使用独立 JSON 的用户可以切换到 C++ Alliance 的分支
    • 添加了 `std::error_code` 重载。
    • 将 `boost::source_location` 添加到 `error_codes`。
    • 添加了对 JSON 指针的支持。
    • 在序列化期间自然增长字符串。
  • LEAF:
    • 支持 FreeRTOS 和其他嵌入式平台
    • 改进的诊断信息
    • 改进的配置宏
    • 在 `__GNUC__` 下使用 `BOOST_LEAF_CHECK` 语句表达式
    • 修复了符号反汇编错误
  • 日志:
    • 一般更改
      • 在 `text_file_backend` 中,添加了对追加到先前写入的日志文件(当使用文件轮换并且日志文件名使用文件计数器时)的支持。
      • 破坏性更改:`file_collector` 接口已更改
        • `scan_for_files` 方法返回一个 `scan_result` 结构,其中包含扫描期间收集的信息;
        • 添加了 `is_in_storage` 方法,用于测试路径是否指向目标存储目录中的文件。
      • 添加了一个新的 `invoke_manip` 流操作符,可用于将用户函数注入流输出表达式中。
    • 错误修复
      • 修复了如果用户多次调用 `text_file_backend::scan_for_files` 并且第二次及后续调用没有找到任何新文件,则文件计数器被设置为零的问题。(#179)
    • 有关更多详细信息,请参阅 更改日志
  • 多索引容器:
    • 将排名索引中 `count` 操作的效率从 `O(log(n) + count)` 提高到 `O(log(n))`。由 Damian Sawicki 贡献。
    • 维护工作。
  • Nowide:
    • 修复了某些平台上的编译问题(例如,MinGW-w64 和 Cygwin 上的 GCC 11)
    • 修复了使用 `BOOST_USE_WINDOWS_H` 和 `WIN32_LEAN_AND_MEAN` 时缺少包含文件的问题
    • 在使用 `boost::nowide::stat` 和 `boost::nowide::stat_t` 时添加了健全性检查
  • 可选:
    • 修复了 问题 #98
    • 修复了 问题 #92
    • 添加了对 `BOOST_NO_IOSTREAM` 的支持。
    • 现在对齐存储使用 `unsigned char` 而不是 `char` 以避免未定义行为。
    • 现在使用 cv-unqualified `value_type` 和就地 `new` 以避免未定义行为。
  • 预定义:
    • 1.14.0 版
    • 添加了 LoongArch 的检测(来自张娜)。
  • QVM:
    • 在 C++17 下添加了 constexpr
    • 改进了单头文件分发
  • 智能指针:
    • 添加了 `boost::get_allocator_pointer` 以从 `boost::allocate_unique` 的结果中获取分配器指针(Glen Fernandes)。
  • 系统:
    • 向 `throw_exception_from_error` 添加了 `boost::source_location` 参数。
    • 为 `errc::errc_t`、`std::error_code`、`std::errc`、`std::exception_ptr` 添加了 `throw_exception_from_error` 重载。
    • `result<T>::value` 现在通过默认参数自动向 `throw_exception_from_error` 提供 `BOOST_CURRENT_LOCATION`。
    • 添加了一个采用源位置的 `errc::make_error_code` 重载。
  • 抛出异常:
    • 添加了 `boost::throw_with_location`,这是一个更轻量级的 `BOOST_THROW_EXCEPTION` 替代方案,适用于不使用 Boost.Exception 的程序。
  • 无序:
    • 所有容器都已更新为支持异构 `count`、`equal_range` 和 `find`。
    • 所有容器现在都实现了成员函数 `contains`。
    • 已为所有容器实现了 `erase_if`。
    • 所有容器都已更新为支持异构 `erase` 和 `extract`。
    • 更改了 `reserve` 的行为,使其积极分配。
    • 测试套件中的各种警告修复。
    • 更新代码以在内部使用 `boost::allocator_traits`。
    • 切换到斐波那契哈希。
    • 更新文档,使用 AsciiDoc 代替 QuickBook 编写。
  • Variant2:
    • 添加了 `operator<<` 用于 `monostate`。
  • Wave:
    • 现在需要 C++11 来构建 Wave 本身
    • 修复的错误
      • #135:C++20 中已弃用数组下标中的逗号运算符
      • #137:简单的未知指令 => 未调用 `found_unknown_directive`,已去除井号。
      • #138:空 ifdef 块不会为缺少的空格发出行指令
      • #143:解析 `__has_include()` 在尾随标记时失败
      • #145:Sanitizer 抱怨 `reset_version()`
      • #147:不同枚举类型之间的按位运算已弃用

更新的工具

已测试的编译器

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 负责此版本的发布。