这是 Boost 的旧版本,发布于 2023 年。当前版本是 1.89.0。
版本 1.82.0
2023年4月14日 03:08 GMT
文档
已知问题
这些是库作者的补丁,发现太晚,无法在本次发布中修复。
- Filesystem
- 由于 OpenBSD 平台上共享库对
-Wl,--no-undefined
编译器标志的支持已损坏,在 OpenBSD 上编译可能会失败,请参见 #283。 补丁。
- 在 Windows 上,枚举 SMBv1 共享中的目录迭代器可能会因
ERROR_INVALID_LEVEL
错误代码而失败,请参见 #284。 补丁。
关于放弃 C++03 支持的通知
以下库将在 1.84 版本(即两次发布后)放弃对 C++03 的支持。
- Align
- Any
- Asio
- Atomic
- Bind
- Chrono
- ContainerHash
- Conversion
- DLL
- Endian
- Filesystem
- 函数
- Functional
- Io
- LexicalCast
- Log
- Random
- Ratio
- SmartPtr
- 系统
- Stacktrace
- Thread
- Timer
- TypeIndex
- Typeof
- Unordered
- Variant
本次发布(1.82)和下一次发布(1.83)将是上述库及其大多数依赖项提供 C++03 支持的最后一次发布。
上述库以及 Boost 大多数库的新的基线要求将是 C++11。由于旧的编译器版本通常只部分实现 C++11,因为缺少支持或存在 bug,所以满足 C++11 要求的编译器可能会因库而异。
然而,一个普遍的规则是,如果一个编译器根本不识别 C++11 关键字或语法(例如,使用 noexcept
、constexpr
,或者定义一个 =delete
d 函数会导致立即编译错误),或者一个编译器根本不提供必需的 C++11 头文件(例如,包含 <atomic>
或 <chrono>
失败),或者编译器提供的 C++11 特性或头文件完全不可用,那么这个编译器不被认为是 C++11 编译器。
例如,这排除了 14.0 之前的 Microsoft Visual C++,或者 4.8 之前的 GCC。
新库
- Mysql:
- 一个基于 Boost.Asio 的 C++11 MySQL 数据库服务器客户端,来自 Ruben Perez。
更新的库
-
Any:
- 现在使用
core/enable_if.hpp
头文件,而不是已弃用的 utility/enable_if.hpp
。感谢 Michael Ford 的 PR PR#25。
-
Asio:
- 增加了在操作即时完成时自定义完成处理程序执行的能力。
- 为缓冲区类型添加了用户定义字面量。
- 添加了一个新的协议类型
local::seq_packet_protocol
,用于表示具有 SOCK_SEQPACKET
的 AF_UNIX
。
- 通过
signal_set::add
的可选参数暴露了 sigaction()
标志。
- 更改
allocator_binder
、executor_binder
和 cancellation_slot_binder
以支持未特化的关联器的检测。
- 修复了
associated_cancellation_slot<reference_wrapper>::get()
中的歧义。
- 修复了
awaitable<>
处理包含 std::exception_ptr
的完成签名。
- 修复了
experimental::channel<>
在 cancel
后 try_send
失败的问题。
- 修复了线程池为空时
thread_pool::join()
死锁的问题。
- 修复了使用时管道
release()
的问题io_uring.
- 修复了数据初始化和在io_uring后端清理问题。
- 修复了执行上下文重载
get_associated_executor()
中的悬空引用问题。
- 确保在
experimental::channel<>
关闭时,缓冲的消息仍可接收。
- 修复了
any_completion_handler
的赋值运算符。
- 限制了
any_completion_handler
的构造函数,以防止意外复制
- 更改为使用
uint64_t
表示 OpenSSL 选项,以匹配 OpenSSL 3。
- 修复了
deferred
与多个完成签名的互操作性。
- 修复了通道,增加了对 C++11 和 C++14 的部分支持。
- 为
co_composed
和 'awaitable<>' 协程添加了缺失的处理器跟踪源位置支持,在等待打包的异步操作时。
- 修复了一些“潜在空指针解引用”和变量遮蔽警告。
- 修复了与
const_buffers_1
和 mutable_buffers_1
一起使用时的 asio::buffer
重载选择。
- 除非针对较旧的 Windows 版本,否则禁用了当前 Windows 版本的运行时检查。
- 修复了缓冲流包装器与可移动构造的流(如
ssl::stream<>
)之间的兼容性。
- 修复了
basic_socket_acceptor::async_accept
与具有推导返回类型的 lambda 的兼容性。
- 修复了
as_tuple
与旧式完成标记的兼容性。
- 修复了
redirect_error
与新完成标记的兼容性。
- 修复了 Windows 上因应被允许从析构函数中逃脱的异常而可能意外终止程序的错误。
- 防止了对布尔表达式的无意
co_await
。
- 修复了
experimental::use_coro
中的结果处理和对自定义分配器的支持。
- 修复了
is_async_operation
和 completion_signature_of
的可变参数模板模拟。
- 修复了
experimental::promise
中已移动结果的错误重用。
- 修复了
experimental::coro
与自定义分配器的使用。
- 修复了 Windows 上流式文件
seek_cur
的行为。
- 对文档进行了各种添加和修改。
- 请查阅 修订历史 以获取更多详细信息。
-
Atomic:
- 在编译为支持 AVX 的 x86 目标时,现在使用向量指令进行 128 位原子加载和存储。
- 对于 32 位 x86 目标,具有
memory_order_seq_cst
语义的 64 位原子加载和存储现在将发出内存排序指令。
- 删除了 Boost.Atomic 1.73 中已弃用的
atomic<T>::storage()
访问器和 atomic<T>::storage_type
类型。建议用户使用 atomic<T>::value()
和 atomic<T>::value_type
代替。
-
Beast:
- 添加
error_code
使用 source_location
- tcp_stream 使用定时器的正确执行器。
- error_categories 使用数字 id
-
file_body
支持 seek
-
ContainerHash:
- 为
std::nullptr_t
添加了 hash_value
的重载。
- 添加了
is_tuple_like
和用于类元组类型的 hash_value
重载。
- 将字符串哈希更改为使用
mulxp1_hash
。这提高了质量和速度。
-
Core:
- 添加了
boost/core/snprintf.hpp
头文件,其中包含 snprintf
、vsnprintf
及其 wchar_t
对应项的可移植定义。
- 弃用了
boost/core/is_same.hpp
和 boost::core::is_same
。该头文件将在未来的版本中移除。建议用户使用 Boost.TypeTraits 或 C++ 标准库类型特征。
- 将
boost::ref
成员函数和相关方法标记为 noexcept
。
- 将
boost::swap
函数标记为 noexcept
,具体取决于类型是否支持非抛出交换操作。
- 添加了
boost::core::launder
,这是 std::launder
的可移植实现。
- 添加了
BOOST_CORE_ALIGNOF
,这是 alignof
的可移植实现。
- 添加了
boost::core::max_align_t
,这是 std::max_align_t
的可移植对应项,以及 boost::core::max_align
,即 max_align_t
的对齐。
- 添加了
boost::core::memory_resource
,这是 C++17 中 std::pmr::memory_resource
的可移植对应项。
- 添加了
boost/core/serialization.hpp
,这是一组原始类型,允许库为它们的类型实现 Boost.Serialization 支持,而无需包含 Serialization 头文件,从而避免其库依赖于 Serialization。
- 添加了
boost::data
,这是 std::data
的实现。
- 添加了
boost::size
,这是 std::size
的实现。
- 更新了
boost::span
以使用 boost::data
,这增加了对 std::initializer_list
的范围构造的支持。
- 添加了
boost::identity
,这是 std::identity
的实现。此功能已从 Boost.Functional 移至此处。
-
DLL:
- 避免从 size_t 到 uint32_t 的隐式转换,感谢 Travers Biddle 的 PR PR#57。
-
Filesystem:
- 修复了可能由
path
转换构造函数对接受的参数过于宽容而导致的编译错误。( #273 )
-
v4:
path::remove_filename
现在会保留末尾的目录分隔符。( #271 )
- 添加了
path::remove_filename_and_trailing_separators
,它会从路径中移除文件名及其前面的目录分隔符。此行为类似于 Filesystem **v3** 中的 path::remove_filename
,但在 **v4** 中也可用。
- 添加了
path::replace_filename
,用于替换路径中的文件名。
- 更新了库版本选择的实现,以避免 ODR 冲突。( #279 )
- 在 Windows 上,为 SMBv1 共享中的文件查询文件属性添加了变通方法。以前,SMBv1 共享中的目录可能被报告为普通文件。这不影响 SMBv2 或更高版本。( #282 )
-
几何:
- 主要改进
-
PR#1045 支持 (multi)linestrings 和 (multi)polygons 的地理缓冲区
- 改进
- 已解决的问题
- 破坏性更改
- 空多边形的 WKT 输出表示现在是 POLYGON(),以使其与其它几何图形一致。
-
直方图:
- 用
boost::core
中的实现替换了 detail::span
和 detail::make_span
。
- 文档改进
- 在某些情况下保护
std::min
和 std::max
的使用,由 Han Jiang 贡献(min,max 宏已被流行的 Windows 头文件非法设置,所以我们需要规避)
- 添加了测试以在未来捕获库中未受保护的 min,max 令牌的使用。
- 修复以支持最新的 clang-14 和 gcc-11+ 的推导指南。
-
JSON:
-
set_at_pointer
.
-
boost::hash
支持。
- 调用者提供的序列化器存储。
-
value_to
支持 std::optional
的缺失元素。
- 修复了转义字符内的解析器挂起。
- 使 sentinel() 返回一个唯一指针。
-
Locale:
-
get_system_locale
及其依赖项现在将根据 POSIX PR#144 的定义,正确地优先使用 LC_ALL
而不是 LC_CTYPE
。
-
utf8_codecvt::out
为尾部(UTF)代理返回 partial
。
- 添加
boost::locale::util::locale_data
来解析区域设置。
-
boost::locale::info::encoding()
的结果现在是大写的,如文档所述,例如 "UTF-8" 而不是 "utf-8"。
- 支持 M49 国家代码,如
en_001
或 en_150
PR#148
- 将
en_US_POSIX
视为 C
区域设置的别名 PR#148
- 改进了对缺失分段支持(即没有 ICU)的错误处理 PR#149
- 修复编译器警告
-
数学:
-
弃用 C++11 支持:我们现在要求 C++14 作为最低标准。我们最低测试的编译器版本是 Clang-5、GCC-5 或 MSVC-14.1。
- 添加了用于多项式求值的 Estrin 方法。
- 修复了非中心分布中的各种问题,以允许更大的非中心性,请参见 939。
- 添加了 CMake 安装目标。
- 修复了 special_functions.hpp,以禁用在无异常环境中无法使用的任何功能。
- 使条件数计算在 C++14 中正常工作。
- 修复了
constexpr
表驱动函数,以避免在代码实际不是 constexpr
时导致巨大减速,请参见 923。
- 改进了 tanh_sinh 边界处理,请参见 894。
- 添加了 Linux arm64、s390x 和 Apple M1 测试,修复了测试用例以处理 128 位 long double。
- 改进了
constexpr
数学函数,以更好地处理无穷大和 NaN。
- 使积分器具有 const 正确性。
- 修复了 tanh_sinh 积分器在函数下溢时的情况,请参见 898。
- 不要使用
std::cbrt
,因为有些平台仍然不支持它。
- 停止非中心 T 引发虚假的 FE_INVALID 异常,请参见 892。
- 修复了二项式分布的边缘情况。
- 改进了 ibeta 对非常小参数的处理,请参见 884。
- 改进了 ibeta 对无穷大和 NaN 的处理,请参见 878。
- 改进了 powm1 中的错误处理,请参见 781。
- 改进了求根器括号化,以便在指数超大或超小时更快地括号化。
- 修复了求根边缘情况,请参见 873。
- 大量杂项警告修复。
- 在使用需要 C++17 的功能时添加断言,以便在以较低 std 版本调用编译器时提供更好的错误消息。
-
多索引容器:
- Serialization 现在使用
unsigned long
而不是 collection_size_type
,并且 multi_index_container
serialization 类版本已从 2 提升到 3 以反映此更改。读取旧的存档可能会因自定义存档类型对 collection_size_type
值进行特殊处理而失败:如果发生这种情况,请全局定义宏 BOOST_MULTI_INDEX_ENABLE_SERIALIZATION_COMPATIBILITY_V2
以确保读取操作的向后兼容性。
- 维护工作。
-
Multiprecision:
-
弃用 C++11 支持:我们现在要求 C++14 作为最低标准。我们最低测试的编译器版本是 Clang-5、GCC-5 或 MSVC-14.1。
- 添加了一个新的前向声明头文件。
- 更新了 Eigen 互操作性,使我们不再依赖 Eigen 的细节,请参见 479。
- 添加 Cmake 安装目标。
- 修复了 standalone 情况下的 cpp_dec_float 从字符串构造,以获得更好的错误处理,请参见 499。
- 在 C++17 模式下移除冗余定义,请参见 530。
- 修复了 standalone itrunc 和 ltrunc 中的错误处理。
- 修复了解析八进制字符串时可能未初始化的存储。
- 添加 arm64 和 s390x CI 测试。
- 为
powm
添加了一些缺失的表达式模板解包代码,请参见 506。
-
Nowide:
- 添加接受 (
std::
)string 实例的 convert_string
重载。
- 将
quoted
添加到输出(带引号的 UTF-8)路径(std::filesystem
或 boost::filesystem
)到流中 PR#170。
-
PFR:
- 实现了
boost::pfr::is_implicitly_reflectable
以及用于将聚合体特化为可反射或不可反射的机制,感谢 Denis Mikhailov 的 PR PR#111。
- 实现了
boost::pfr::get
按聚合体中元素的类型。
- 实现了
BOOST_PFR_ENABLED
宏来检测库对反射的支持,感谢 Denis Mikhailov 的 PR PR#86。
- 修复了缺失的终止字符,感谢 Denis Mikhailov 的修复 PR#114。
- 修复了
boost/pfr/config.hpp
在旧编译器上的编译问题,感谢 Denis Mikhailov 的 PR PR#118。
- 为旧编译器中损坏的 C++17 结构化绑定提供变通方法,感谢 Denis Mikhailov 的 PR PR#119。
- 避免 -Wzero-as-null-pointer-constant 警告,感谢 Markus F.X.J. Oberhumer 的 PR PR#117。
- 修复了多个拼写错误,感谢 Denis Mikhailov 的修复。
- 添加了缺失的
#pragma once
,感谢 caozhanhao 的 PR PR#121。
- 文档的多个修复和改进。
-
Process:
- 为 V2 添加了外部进程管理(仍处于实验阶段)
- 在 V1 中弃用了
wait_for
和 wait_until
- 它们将在未来被移除!
-
Stacktrace:
- 修复了文档和注释中的拼写错误,感谢 Chocobo1 的 PR PR#132。
- 如果定义了
BOOST_STACKTRACE_BACKTRACE_FORCE_STATIC
,则修复了 backtrace_create_state
的多线程标志检测。
-
StaticString:
- Boost.Core
string_view
和 std::string_view
互操作性
-
Test:
- 修复了几个未使用的变量警告
- 修复了 sprintf 弃用警告
- 修复了
basic_cstring::rfind
中的未定义行为
- 通过 Github Actions 添加了 CI
-
Unordered:
-
重大更新。
- 添加了基于节点的开放寻址容器
boost::unordered_node_map
和 boost::unordered_node_set
。
- 按照 P2363 的要求,将异构查找扩展到更多成员函数。
- 将开放寻址容器的先前后混合过程替换为基于扩展常量乘法的算法。
- 修复了内部
emplace
实现中的错误,该错误导致栈局部类型未正确使用容器的分配器进行构造,从而破坏了 uses-allocator 构造。
-
URL:
- 添加
url::format
并自动进行百分比编码
- URL 路由器示例
-
set_params
便利函数
- 支持隐式转换为
string_view
- 解析构造函数是隐式的
-
string_token::arg
具有虚析构函数和切片保护
- 支持
BOOST_URL_DISABLE_THREADS
- 改进和错误修复
- WIN32_LEAN_AND_MEAN 宏重定义警告
- 比较区分缺失和空的组件
- 检测带有空端口段的
hier_part_rule
- 在根之上,段比较(如已规范化)正常工作
- hier-part path-rootless 考虑无效段
- 当端口溢出时,port 作为数字设置为 0。
- ipv4 到字符串溢出检测算法
-
Variant:
- 现在使用 core/addressof 代替已弃用的 utility/addressof。感谢 Michael Ford 的 PR PR#105。
更新了工具
测试的编译器
Boost 的主要测试编译器是:
- Linux
- Clang, C++03: 3.4, 3.5, 3.6, 3.7, 3.8, 3.9, 12.0.0, 13.0.0, 14.0.0, 15.0.0
- Clang, C++11: 3.4, 11.0.0, 13.0.0, 14.0.0, 15.0.0
- Clang, C++14: 3.5, 3.6, 3.7, 3.8, 3.9, 4.0, 5.0, 12.0.0, 13.0.0, 14.0.0, 15.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, 13.0.0, 14.0.0, 15.0.0
- Clang, C++20: 11.0.0, 12.0.0, 13.0.0, 14.0.0, 15.0.0
- GCC, C++03: 4.6.3, 11, 12
- GCC, C++11: 4.7.3, 4.8.5, 11, 12
- GCC, C++14: 5.4.0, 6.4.0, 7.3.0, 8.0.1, 9.1.0, 11, 12
- GCC, C++17: 7.3.0, 8.0.1, 9.1.0, 11, 12
- GCC, C++20: 8.0.1, 9.1.0, 10, 11, 12
- OS X
- Apple Clang, C++03: 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, 14.3
致谢
Marshall Clow 和 Glen Fernandes 管理了此次发布。