Boost C++ 库

...世界上最受尊敬和设计最精良的 C++ 库项目之一。 Herb SutterAndrei AlexandrescuC++ 编码标准

版本 1.77.0

版本 1.77.0

2021 年 8 月 11 日 14:25 GMT

文档

下载
平台文件SHA256 哈希
unixboost_1_77_0.tar.bz2fc9f85fc030e233142908241af7a846e60630aa7388de9a5fafb1f3a26840854
boost_1_77_0.tar.gz5347464af5b14ac54bb945dc68f1dd7c56f0dad7262816b956138fc53bcc0131
windowsboost_1_77_0.7zf2dd9722b21450daf5ce8ef82c2d99c7ec304f913ee6c6b7f047d5639503dda1
boost_1_77_0.zipd2886ceff60c35fc6dc9120e8faa960c1e9535f2d7ce447469eae9836110ea77
* 下载链接由 C++ 联盟 的资助支持。

新库

  • Describe: 来自 Peter Dimov 的 C++14 反射库。提供用于描述枚举器和结构体/类成员的宏,以及用于查询此信息的原语。
  • Lambda2: 来自 Peter Dimov 的 C++14、无依赖、单头 lambda 库。允许通过诸如 _1 + 5_1 % 2 == 0_1 > _2_1 == ' ' || _1 == '\t' 等表达式构建简单的函数对象。

更新的库

  • Any:
    • 添加了 boost::anys::basic_any - 一种具有可定制的小对象优化功能的数据类型,其实例可以保存满足 ValueType 要求的任何类型的实例(非常感谢 Ruslan Arutyunyan @rarutyun)。如果您不确定是否真的需要它,请改用 boost::any
    • 开始使用 GithubActions CI 进行额外测试
  • Asio:
    • 添加了对取消单个异步操作的支持。
    • 添加了 associator 特性,用于泛型地转发关联器。
    • 更改了 Asio 中实现的所有异步操作,以将它们的完成处理程序作为右值引用调用。
    • 添加了对具有多个完成签名的异步操作的支持。
    • awaitable<> 添加了 operator&&operator||,以允许在并行中轻松等待协程。
    • 添加了 experimental::as_tuple 完成标记适配器。
    • 添加了 experimental::append 完成标记适配器。
    • 添加了 experimental::prepend 完成标记适配器。
    • 添加了 experimental::deferred 完成标记,该标记允许异步操作的延迟执行。
    • 添加了 experimental::parallel_group 类和 experimental::make_parallel_group 函数。
    • 添加了 experimental::promise,允许异步操作的急切执行和同步。
    • 添加了 experimental::coro 类模板,这是一个 C++20 协程原语,能够组合异步等待(co_await)和让步(co_yield)。
    • ssl::stream<> 添加了移动赋值。
    • 更改了 co_spawn 以将协程的初始步骤 dispatch 到执行器。
    • 当与异步操作一起使用时,为 any_executorany_io_executor 启用了额外的优化。
    • awaitable<> 添加了 nodiscard 属性。
    • 增加了默认回收分配器中的缓存槽数量。
    • 更改了默认分配器行为以尊重对齐要求,以支持过度对齐的类型。
    • 确保在反向名称解析中始终初始化结果字符串。
    • 修复了 use_awaitable_t::executor_with_default 中的递归模板实例化问题。
    • 修复了 any_io_executor 相等运算符以根据目标执行器正确返回结果。
    • 修复了 strand<> 以避免使用可能已移动的执行器。
    • 确保gcc测试不用于clang在检测编译器特性时。
    • 禁用了对clang随 MSVC 一起提供的协程支持。
    • 当定义了 OPENSSL_NO_SSL_INTERN 时,修复了与最近的 LibreSSL 的兼容性。
    • 修复了 posix::basic_stream_descriptor 移动操作,以使用非默认的执行器。
    • 有关更多详细信息,请参阅 修订历史
  • Atomic:
    • 添加了 make_atomic_refmake_ipc_atomic_ref 工厂函数,用于构造原子引用对象。
    • atomic_refipc_atomic_ref 添加了 C++17 模板参数推导指南,以允许在可以从构造函数参数推导时省略模板参数。
  • Beast:
    • 此维护更新带来了小的错误修复和更新的 CI 报告。
    • 我们很想知道您或您的公司如何使用 Beast,请考虑在 使用 Beast 的公司和个人 列表中添加一个条目。
    • 有关更改的完整列表,请参阅完整的 发行说明
  • Conversion:
    • boost::implicit_cast 现在是 constexpr (#25)。
    • 修复了损坏的链接 (PR#23)。
    • 开始使用 GithubActions CI 进行额外测试
  • Core:
    • 已修改 boost/core/uncaught_exceptions.hpp 以与 Mac OS 10.4 及更早版本兼容。 (PR#92)
  • DLL:
    • boost::dll::library_info 中对格式错误的 ELF 进行更多运行时检查
    • boost::dll::library_info 中,如果 .symtab 为空或缺失,则使用来自 .dynsym ELF 节的信息
    • boost::dll::library_info 中列出受保护的 ELF 符号,因为它们可用于导入 (#50)
    • 删除了 POSIX 环境上从 wchar_t 到 char 的不必要转换,感谢 Vladislav Shchapov (PR#49)
    • 开始使用 GithubAction CI 进行额外测试
  • Filesystem:
    • 推出 Boost.Filesystem v4。 此库的新版本删除了 v3 的所有已弃用功能,并进行了一些破坏性的 API 更改,旨在使 Boost.Filesystem 更兼容 C++17 中引入的 std::filesystem。差异在发行说明和文档中使用 v3v4 标签进行描述,并在单独的部分中进行总结。用户可以通过在编译代码时将 BOOST_FILESYSTEM_VERSION 宏定义为 3 或 4 来选择 Boost.Filesystem 版本。无需为每个库版本单独编译 Boost.Filesystem - 单个二进制文件同时支持 v3 和 v4。用户应避免在同一应用程序中使用 v3 和 v4,因为这可能会导致细微的错误。目前,v3 是默认值。在未来的版本中,v4 将成为默认值,最终将删除 v3。v4 功能正常,但仍处于开发阶段,未来可能会出现破坏性的 API 更改。
    • v4: 如果路径仅由这些组件组成,则 path::filenamepath::stempath::extension 不再将路径的根名称或根目录视为文件名。例如,在 Windows 上,path("C:").filename() 过去返回 "C:",而 path("C:\\").filename() 过去返回 "\",现在它们都将返回一个空路径。(#88, #194)
    • v4: path::stempath::extension 不再将以点开头且没有其他点的文件名视为扩展名。以点开头的文件名通常被视为具有空扩展名的文件名。前导点用于指示大多数类 UNIX 系统上的隐藏文件。 (#88)
    • 新增: 改进了 Windows 上各种路径前缀的支持。添加了对本地设备前缀 ("\\.\") 和实验性 NT 路径前缀 ("\??\") 的支持。这些前缀将包含在路径的根名称中。请注意,在 Boost.Filesystem v3 中使用这些前缀可能会导致意外的结果(例如,path("\\\\.\\").stem() == "\\\\")。建议仅在 Boost.Filesystem v4 中使用这些前缀。
    • 重构了 path::lexically_normal 的实现,以消除规范化路径中重复的点 (".") 元素的一些情况。
    • 新增: 在 Linux 上添加了对 statxgetrandom 系统调用的运行时检测。如果系统调用在编译时存在,但在运行时因 ENOSYS 而失败(例如,在限制系统调用的 Docker 容器中,即使在主机上可用),这将非常有用。(#172
    • 新增: 添加了在库构建时禁用各种系统 API 使用的支持。当库配置脚本检测到某个 API 存在,但由于某种原因(例如,当运行时检测在目标系统上不起作用时)不能使用时,这将非常有用。有关详细信息,请参阅库文档中关于配置宏的描述。
    • 新增:copy_file 操作添加了 copy_options::synchronize_datacopy_options::synchronize 选项。这些选项允许将写入的数据和属性与永久存储同步。这些选项在性能方面代价很高,但可以确保复制数据的可靠性。请注意,自 Boost.Filesystem 1.74.0 以来,copy_file 在 POSIX 系统上执行隐式数据同步。此版本添加了对更多平台的支持,并默认禁用数据同步,同时允许调用者显式请求同步。(#186
    • 在 POSIX 系统上,为内部发出的一些系统调用添加了 EINTR 错误代码的处理。特别地,EINTR 可能在 close 上被忽略,这在 HP-UX 上会导致文件描述符泄漏。
    • 在基于 Linux sendfilecopy_file_range 系统调用的 copy_file 实现中,添加了对指示特定文件系统不支持系统调用的错误代码的处理,并回退到通用的 read/write 循环。这应该可以修复 copy_fileeCryptFS 和其他文件系统上失败的问题。(#184
    • 自 Linux 内核 4.5 起,现在使用 copy_file_range 系统调用,而之前仅从 5.3 版本开始启用。如果 copy_file_range 无法在文件系统之间复制给定的文件,则 copy_file 实现将回退到 sendfileread/write 循环。
    • 基于 Linux sendfilecopy_file_range 系统调用的 copy_file 实现将不会在已知包含生成内容的文件系统上使用。这些系统调用与此类文件不兼容,复制它们会导致文件大小为零。将改为使用通用的 read/write 循环。目前,列入黑名单的文件系统包括:procfs、sysfs、tracefs 和 debugfs。
    • 在基于 read/write 循环的 copy_file 实现中,增加了用于临时存储的缓冲区的最大大小,并考虑目标文件系统块大小以获得更优化的性能。
    • 在 Windows CE 上,调用 current_path 来获取进程的当前路径现在将失败并返回错误,而不是成功返回根路径。此平台不支持当前目录。在 Boost.Filesystem 的先前版本中,更改当前路径已经会类似地失败。
    • canonical 中,修复了如果较早的符号链接解析为与原始路径不同的根的绝对路径时,检查引用根目录上方的目录的符号链接的问题。
    • canonical 中,添加了在调用期间可以解析的最大符号链接数的限制。该限制目前至少为 40 个符号链接。
    • 在 Windows 上,canonicalweakly_canonical 现在将在结果路径中使用 path::preferred_separator 作为根目录分隔符。这修复了由于 Windows API 不处理 UNC 路径和以 Win32 文件系统前缀("\\?\")开头的路径中的通用分隔符而导致的“文件未找到”错误。(#87#187
    • 新增: 添加了以 base 路径作为参数的 weakly_canonical 重载。
    • 在 Windows 上,如果输入路径包含文件系统中不存在的元素,但被后续的点点("..")元素取消,则 weakly_canonical 不再失败并返回错误。例如,如果 "C:\a" 目录不存在,则 weakly_canonical("C:\\a\\..") 之前会失败。(#201
    • 在 Windows 上的 read_symlink 中,更正了重解析点的处理。对于某些挂载点(例如,由 Box 云存储驱动程序创建的)和具有空打印名称的目录连接点,该操作将返回空路径。新实现现在解析重解析点的替代名称,并尝试从中重建 Win32 路径。(#187
    • 在 Windows 上,当标准库支持使用宽字符路径打开文件时,boost/filesystem/fstream.hpp 中提供的文件流将在 libc++ 7.0 及更高版本上使用宽字符路径。(#181
    • 在 Windows 上,如果 Windows 配置为开发者模式,则创建符号链接不再需要提升的权限。
    • 对于某些编译器,Boost.Filesystem 内部使用的全局对象现在会在用户的全局析构函数调用之后销毁。这允许在程序终止阶段调用 Boost.Filesystem 方法。特别是,这涉及用于字符代码转换的路径区域设置,可以通过调用 path::imbue 来安装。支持的编译器包括 MSVC、GCC 和 Clang,以及其他支持通过 #pragma section(对于与 MSVC 兼容的编译器)或 __attribute__ ((init_priority))(对于与 GCC 兼容的编译器)自定义程序初始化顺序的编译器。
  • 几何:
    • 改进
      • PR#812 距离和 comparable_distance 的伞形策略(目前未记录)。
      • PR#840 各种算法的伞形策略(目前未记录)。
      • PR#850 引入了 DynamicGeometry 和 GeometryCollection 概念,并在一些算法中提供支持(目前未记录)。
      • PR#855 与策略相关的各种改进。默认策略现在包含在算法中。
    • 已解决的问题
      • #865 在 rtree 序列化中抛出异常。
      • #439 无效的球形区域计算。
      • #838 union_() 的无效结果。
      • #851 无效的地理分离线段/框结果。
      • #861 intersection() 的无效结果。
    • 错误修复
      • PR#832 修复了球形和地理区域的计算。
      • PR#853 修复了地理分离线段/框的问题。
      • PR#866 修复了 rtree 根节点中包含的元素数量少于最小值时的序列化问题。
      • PR#886 修复了 knn rtree 查询的错误,该错误导致在 k 很大时速度变慢。
      • 集合操作和缓冲区中的各种修复。
  • JSON:
    • value_to 支持 TupleLike 类型。
    • value_tovalue_from 支持 std::array 和类似的类型。
    • stringstd::string_view 的隐式转换运算符。
    • json 类型的 std::hash 特化。
    • 修复了 objectkey_value_pair 中的分配错误。
    • 修复了从构成空范围的一对迭代器构造 array 时发生的崩溃。
  • LexicalCast:
    • 修复了将超出 int 可表示范围的浮点值赋值给 int 的问题。
    • 开始使用 GithubActions CI 进行额外测试
  • Log:
    • 修复了 riscv32 目标的编译问题。(PR#150
  • Mp11:
    • 添加了 mp_interspersemp_splitmp_join
  • 多索引容器:
    • 维护工作。
  • Nowide:
    • 允许在 main 之前使用 iostream 类(尽力而为,适用于大多数环境)
    • 修复了重定向输入/输出时 cin/cout/cerrrdbuf 的初始化
    • 修复了使用 putback()cin::unget() 中的极端情况
    • 修复了移动赋值后可能延迟的 filebufclose
    • 提高了 utf8_codecvt 的性能
  • PFR:
    • 现在使用基于 MurMur Hash 的 hash_combine() 实现来减少冲突计数并提高 boost::pfr::hash_value() 的质量
    • Visual Studio 2017 现在支持 C++14 模式(感谢 Denis Mikhailov,又名 @denzor200)
    • 修复了 inspect 工具发现的问题
    • 修复了一些警告,包括移除了 include/boost/pfr/detail/fields_count.hpp 中的多余分号 (#72)
    • 为继承类型添加了编译时断言(感谢 Denis Mikhailov,又名 @denzor200)
    • 如果保证了复制省略,现在可以反射具有不可移动字段的聚合类型
    • 修复了拼写问题
    • 开始使用 GithubActions CI 进行额外测试
  • PropertyTree:
    • 这是一个维护版本。
    • 扩展 CI 中的编译器覆盖范围。
    • 修复了 CMakeLists.txt 的 Boost 兼容性。
  • System:
    • error_categorystd::error_category 的转换运算符已得到改进,不再需要 <map><mutex>
    • error_category 的比较运算符现在是内联友元函数,而不是成员函数(这是先前更改的副作用)。
    • error_condition 现在推迟调用 generic_category(),以避免在实际需要之前实例化对象。
    • error_condition::failederror_condition::message 已取消弃用,operator bool() 现在再次返回 failed()
    • 系统类别现在不调用 generic_category(),以避免实例化对象。
    • 在某些情况下,default_error_condition 的返回值会变为通用类别的 error_condition,而不是系统类别的。 当输入 error_code 来自系统类别,并且不对应于任何 errc_t 值时,在 POSIX 上会发生这种情况。
    • error_codestd::error_code 的互操作性得到了显著提高。 现在可以从 std::error_code 构造 boost::system::error_code,并且可以将 boost::system::error_code 传递给接受 std::error_code& 的函数。
    • 添加了 error_condition 的流插入运算符。
  • Uuid:
    • 添加了 to_chars 用于写入 uuid 字符串而无需分配内存 (PR#116)

更新的工具

测试的编译器

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 管理了此版本。