Boost C++ 库

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

版本 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) 和 yield (co_yield)。
    • ssl::stream<> 添加了移动赋值。
    • 更改了 co_spawndispatch 协程的初始步骤到执行器。
    • 当与异步操作一起使用时,为 any_executorany_io_executor 启用了额外的优化。
    • awaitable<> 添加了 nodiscard 属性。
    • 增加了默认回收分配器中缓存槽的数量。
    • 更改了默认分配器行为以尊重对齐要求,以支持过度对齐的类型。
    • 确保结果字符串始终在反向名称解析中初始化。
    • 修复了 use_awaitable_t::executor_with_default 中的递归模板实例化问题。
    • 修复了 any_io_executor 相等运算符,以正确返回基于目标执行器的结果。
    • 修复了 strand<> 以避免使用可能已移动的执行器。
    • 确保gcc测试不用于clang当检测编译器特性时。
    • 禁用了为clangMSVC 附带的
    • 协程支持。当定义了 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::filename, path::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)
    • copy_file_range 系统调用现在自 Linux 内核 4.5 起使用,而以前仅自 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 的编译器)自定义程序初始化顺序的编译器。
  • Geometry:
    • 改进
      • PR#812 距离和 comparable_distance 的伞形策略(目前未记录)。
      • PR#840 各种算法的伞形策略(目前未记录)。
      • PR#850 引入了 DynamicGeometry 和 GeometryCollection 概念,并在某些算法中提供支持(目前未记录)。
      • PR#855 与策略相关的各种改进。默认策略现在包含在算法中。
    • 已解决的问题
      • #865 rtree 序列化中抛出异常。
      • #439 无效的 box 球面面积计算。
      • #838 union_() 的无效结果。
      • #851 无效的地理 disjoint 线段/box 结果。
      • #861 intersection() 的无效结果。
    • Bugfixes
      • PR#832 修复了 box 球面和地理面积计算。
      • PR#853 修复了地理 disjoint 线段/box。
      • 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_intersperse, mp_split, mp_join
  • Multi-index Containers:
    • 维护工作。
  • 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 aka @denzor200)
    • 修复了 inspect 工具发现的问题
    • 修复了一些警告,包括删除 include/boost/pfr/detail/fields_count.hpp 中的额外分号 (#72)
    • 为继承类型添加了编译时断言(感谢 Denis Mikhailov aka @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 管理了此版本。