Boost C++ 库

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

版本 1.58.0

版本 1.58.0

2015 年 4 月 17 日 07:53 GMT

文档

下载
平台文件
unixboost_1_58_0.tar.bz2
boost_1_58_0.tar.gz
windowsboost_1_58_0.7z
boost_1_58_0.zip

已知问题

  • 如果 Boost.Python 是针对以下 Python 版本之一编译的,则会构建失败:3.0.X、3.1.X、3.2.X、3.3.X。版本 2.X 和 3.4+ 不受影响。此问题已在 git 中修复。
  • Boost.Fusion 在使用非 constexpr 类型时存在回归问题。#11211 此问题已在以下 PR 中修复:Github PR #70Github PR #71Github PR #72

补丁

新库

  • Endian: 用于正确字节序的类型和转换函数,无论处理器字节序如何。
  • Sort: 包括 spreadsort,一种通用的混合基数排序,比 O(n*log(n)) 快。

更新的库

  • Asio:
    • 确保 Windows 的 ConnectEx 函数生成的错误映射到其可移植的等效项 (#10744)。
    • 添加了新的宏 BOOST_ASIO_DISABLE_CONNECTEX,允许显式禁用 ConnectEx 的使用。
    • 修复了在销毁时存在挂起的等待操作时,windows::object_handle 中的竞争条件 (#10624)。
    • 修复了 FreeBSD 上的 IPv6 地址解析,其中尾随的作用域 ID 会导致转换为失败并出现 EINVAL
    • 通过确保 Asio 类型使用默认可见性来解决共享库可见性问题 (#9465, #11070)。
    • 更改了 SSL 包装器,以便在加载内存中的密钥时调用密码回调 (#10828)。
    • 通过确保在每次操作之前清除 SSL 错误队列来修复错误的 SSL 错误报告。
    • 修复了可能导致虚假“短读取”错误的 ssl::stream<> 错误。
    • 删除了 SSL 引擎中冗余的空指针检查 (#10088)。
    • 添加了禁用 TLS v1.1 和 v1.2 的选项 (#10690)。
    • 删除了已弃用的 OpenSSL 函数 ERR_remove_state 的使用。
    • 修复了 Clang 对各种 C++11 功能的检测 (#8835, #10884)。
    • 修复了 C++11 std::addressof 的检测g++ (#10982).
    • 更改了多播测试,将某些 join_group 失败视为非致命的。
    • 将 Asio 单元测试与 Boost.Test 解耦 (#11116)。
    • 更改了教程以使用 std::endl 来确保输出被刷新。
    • 修复了 Clang 的整数清理器报告的无符号整数溢出。
    • 添加了在使用 yield_context 对象进行异步操作时对仅移动返回类型的支持。
    • 更改了 yield_context 以允许从启动函数对完成处理程序进行可重入调用。
    • 更新了 Windows 运行时的检测以与最新的 Windows SDK 一起使用。
  • Chrono:
    • 版本 2.0.5
    • 修复
      • #10778 VC14 CTP4 Atomic 在使用非 TriviallyCopyable 的 boost::chrono 持续时间时无法编译
      • #10840 test_7868.cpp 中对 puts 调用的 std:: 限定符缺失
      • #10851 time_point_output.cpp 中对 puts 调用的 std:: 限定符缺失
      • #10893 Boost.Chrono 中的次要文档错别字
      • #10992 Chrono IO 状态保存程序与 Boost.IO 状态保存程序不一致
      • #10995 duration_put::put_value 截断小数部分
      • #11006 由于几个错误,无法实例化 time_fmt_io_saver。
      • #11012 chrono_io v2 无法使用 boost::chrono::duration< boost::rational<int> >编译
  • Container:
  • Context:
    • 支持 ARM/iOS (32+64 位)
    • 类 execution_context (C++14)
  • Conversion:
    • 添加了 polymorphic_pointer_downcastpolymorphic_pointer_cast 函数(感谢 Boris Rasin)#10780
    • 现在,所有函数都使用 boost::throw_exception 抛出异常
    • 文档更新
  • DateTime:
    • 恢复了 to_time_t 函数。
    • 将变量 v_type 重命名为 var_type,使其不再与 AIX 系统变量冲突。
    • 文档修复。
  • Flyweight:
    • 添加了使用 std::hashboost::hash 的哈希支持。可以有选择地禁用此功能,以避免与用户已定义此支持的旧代码冲突。
    • 维护修复。
  • Function:
    • 添加了对接受 C++11 右值和 Boost.Move 右值函数的支持 #10585
  • Functional/Factory:
    • 轻微的重大更改:现在指示不应使用分配器的默认模板参数是 void,而不是 boost::none_t。有关详细信息,请参阅 更新日志
  • Fusion:
    • 自动哈希创建函数 (Github PR #12)
    • 新的 ADAPT_STRUCT、ADAPT_ADT、ADAPT_ASSOC_,它们推导出成员类型 (#9516)。
    • 为 Boost.Tuple 和 std::tuple 添加转换实现。
    • 为 Boost.Tuple 和 std::tuple 添加 mpl::clear 实现。
    • 使用 boost::declval 而不是 std::declval (#10190)。
    • 删除 boost::blank 的使用 (#8622)。
    • 添加 result_of::{copy,move} (#5886)。
    • 改进的 constexpr 和 noexcept 支持。
    • 改进了许多元函数的 SFINAE 友好性 (#10676, #10443)。
    • result_of::size::value 和 result_of::size::type::value 现在是相同的类型 (#7304)
    • 当序列的大小小于 N 时,现在定义了 result_of::at<Seq, N>::type (#6507, #7651)
    • 修复了丢失的包含 (#8457)。
    • 许多文档修复和改进(#6090, #5324, GitHub PR #33, GitHub PR #53, GitHub PR #56
  • 几何:
    • 附加功能
      • 新的算法 num_segments,返回几何图形的线段数
      • 新的 is_valid 算法重载,它接受一个字符串引用作为第二个参数,并用与几何图形的有效性或无效性相关的消息填充它
      • 新的 is_valid 算法重载,它接受一个枚举引用作为第二个参数,并用与几何图形的有效性或无效性相关的值填充它
      • Disjoint 和 intersects 支持以下几何组合:点/多点,多点/多点,多点/线段,多点/盒子
    • 改进
      • Buffer 现在支持线串的平端,该线串的弯曲部分接近起始位置(使得缓冲线段穿过平端)。
      • Buffer 性能显着提高
      • Partition 性能针对多边形进行了显着改进,有可能增强所有覆盖操作
    • 已解决的问题
      • #8379 行列式结果的无效比较
      • #10108 在几何图形在一个点接触的特定情况下,覆盖操作中出现错误
      • #10201 关于使用不同函数来比较坐标的建议 [wontfix]
      • #10467 模板参数名称与 termios.h 中定义的 B0 宏名称冲突
      • #10640 CCW 多边形的 buffer() 的无效结果。
      • #10666 MSVC 编译器警告 C4127:条件表达式为常量
      • #10747 重新缩放中的错误导致面积/面积集合操作中出现错误
      • #10770 Buffer 在较大距离或粗糙的圆形连接处失败,因为凹面没有正确相交
      • #10658 sym_difference 为 int 多边形产生错误结果
      • #10835 多线串和多边形的差异产生错误结果
      • #10861 Rtree 对于值为一对或一个包含指向 Geometry 的指针的元组并且使用默认的 equal_to<> 时,编译失败
      • #10863 模板参数名称与 termios.h 中定义的 B0 宏名称冲突(10467 的重复)
      • #10887 Linear/MultiPolygon 的 within() 和 relate() 的无效结果
      • #10890 Point/Segment 的 disjoint() 的无效结果。
      • #10904 在 relate_cartesian_segments 策略中,线段的最重要维度的无效计算
      • #10912 Areal/Areal 的 within() 和 relate() 的无效结果
      • #10951 由于缺少 /bigobj 标志,在 windows 上使用 intel 编译器时测试失败。
      • #10957 断言失败以及各种关系操作的无效结果。
      • #10958 L/L 和 L/A 的 disjoint() 的无效结果。
      • #10959 在使用 no_rescale_policy 时,get_turns() 中出现断言失败。
      • #10960 L/A 的 get_turns() 的无效结果,缺少 turn。
      • #10961 L/A 的 get_turns() 的无效结果,线性尖峰的无效 turn。
      • #11112 由于 CS 名称冲突(在此平台上用于宏),导致 Solaris 上的编译失败
      • #11121 整数坐标的 difference() 的无效结果
    • 错误修复
      • 多点/多边形、多点/多面体距离计算中的错误(错误地检测到面积几何内部的点)
      • flatten_iterator 的赋值运算符中的错误导致访问冲突
      • 当一个线段退化为点并且与另一个非退化线段共线时,笛卡尔线段-线段相交策略中的错误
      • centroid() 中的错误,如果为零面积的多边形计算,则产生不确定的结果。
      • 具有有限数量点的连接的缓冲区中的错误
      • 在尖角周围具有有限数量点的圆形连接的缓冲区中的错误
      • 具有较大缓冲区距离的连接的缓冲区中的错误
      • 具有奇数个点的圆形端点的缓冲区中的错误
      • 具有较大缓冲区距离的平端缓冲区的错误
      • 具有较大负缓冲区距离的内部环的缓冲区中的错误
      • 当输入范围为空时,closing_iterator 无法正常工作的错误
      • is_simple 中的错误,没有正确处理多线串中的封闭简单线串
      • 使用一对迭代器或 Range(打包算法)的 rtree 构造函数中的错误,当 Iterator 的引用不是真引用时,例如对于某些 Range Adaptor,使用了对销毁的临时对象的引用。它还会影响 distance() 和 comparable_distance()。此错误可能导致 rtree 或 distance() 算法的意外行为,例如断言失败或 SEGFAULT。
      • rtree count() 成员函数中的错误,当传递了类型可转换但与 value_type 或 indexable_type 不同的对象时,使用了对销毁的临时对象的引用。如果发生这种情况,可能会返回错误的结果,在大多数情况下为 0。
      • 与范围的处理相关的错误,阻止在某些算法中使用非容器范围编译几何图形(感谢 Samuel Debionne)
  • 哈希:
    • 修复了严格的别名违规问题(GitHub #3)。
  • 进程间:
  • 词法转换:
  • 日志:
    • 错误修复
      • 修复了线程 ID 格式。
      • 修复了进程 ID 格式。( #10926 )
      • 修复了 GNU Hurd 上的构建失败。
      • 修复了文件系统上可用空间耗尽时文本文件接收器后端的不正确行为。接收器将不再尝试创建大量空文件来恢复。( #11016 )
      • 修复了某些情况下 attribute_set::insert() 的不正确行为。插入的元素可能导致一些先前插入的元素无法找到。( #11106 )
      • 如果将大量属性值插入到集合中,则修复了 attribute_value_set::size() 的不正确行为。( #11148 )
    • 有关详细信息,请参阅 变更日志
  • 数学:
    • 添加了两个新的特殊函数 - trigamma 和 polygamma。
    • 对椭圆积分代码进行了大量更新,以使用 Carlson 的最新算法 - 这些算法应该比以前更稳定、更准确并且速度稍快。还添加了对 Carlson 的 RG 积分的支持。
    • 添加了 ellint_d、jacobi_zeta 和 heuman_lambda 椭圆积分。
    • 修复了命名空间范围常量,以便它们在符合要求的编译器上为 constexpr,请参阅 #10901
    • 修复了不完全 beta 和 gamma 函数以及椭圆积分中各种虚假的上溢/下溢情况,感谢 Rocco Romeo。
    • 修复了 3-arg legendre_p 和 legendre_q 函数,以便在最后一个参数实际上不是策略时,不调用基于策略的重载。
    • 清理了不完全 beta 函数中的一些死代码,请参阅 #10985
    • 修复了较大值输入时的极值 pdf,请参阅 #10938
    • 将文档切换为使用 SVG 而不是 PNG 图形和方程 - 浏览器似乎终于赶上了!
  • 移动:
  • 多索引容器:
    • 在查找操作涉及生成 key_type 的临时值的情况下,查找操作的效率得到了提高。考虑以下代码
      typedef multi_index_container<
        std::string,
        indexed_by<
          ordered_unique<identity<std::string> >
        >
      > multi_t;
      ...
      multi_t m=...;
      m.find("boost"); // passed a const char*, not a std::string    
      
      在库的早期版本中,find 操作生成了几个临时的 std::string(每次进行内部比较时都会生成一个)。在足够高级的编译器中,现在避免了这种情况,以便只创建一个临时对象。
    • 维护修复。
  • 多精度:
    • 更改了 frexp 以始终不生成表达式模板,请参阅:10993
    • 改进了在 Cygwin 和其他缺少 long double 支持的平台上对 cpp_dec_float 的支持,请参阅 10924
    • 改进了 noexcept 支持并添加了更多测试,请参阅 10990
    • 为 Intel-15.0 和 Solaris-12.4 编译器应用了各种解决方法。
  • 可选:
    • 改进了文档;记录了 IO 操作和头文件。
    • 修复了错误
      • boost::none_t 不再能从字面量 0 进行转换。这避免了一个错误,即 optional<rational<int>> oi = 0; 会初始化一个不包含值的 optional 对象。
      • 添加了一种手动禁用移动语义的方法:只需定义宏 BOOST_OPTIONAL_CONFIG_NO_RVALUE_REFERENCES。这可以用来解决 #10399 的问题。
      • #10825 通过使用 safe-bool 惯用法改进了防止在没有头文件 optional_io.hpp 的情况下流式输出 optional 的技巧。
      • #11087U 不可赋值或不可转换为 T 时,不再可能将 optional<U> 赋值给 optional<T>
      • #10839 值访问器现在可以正确地处理 optional<T&> 的右值。
  • Phoenix:
    • 版本 3.2.0
    • 新特性
      • Phoenix 现在有一个*延迟列表*实现作为可选扩展。
    • 新示例
      • 一个新的示例 *bind_goose* 展示了 *boost bind* 和 *boost phoenix bind* 之间的兼容性。
    • 修复了错误
      • #10927 phoenix/test/stdlib/cmath.cppfabs 缺少 std:: 限定符
      • #11085 phoenix/test/function/function_tests.cpp 中 pow 调用缺少限定符
      • 修复了 *bind*、*lambda* 和 *let* 中出现的一些失败情况。
  • Predef:
    • 版本 1.2
    • 增加了 Visual Studio 2015 的检测。
    • 增加了 Haiku 操作系统的检测。
    • 修复了 Android 的字节序检测。
    • 添加了 predef_check 程序和 BBv2 集成,用于构建配置检查。
  • Random:
    • 增加了 non_central_chi_squared_distribution。
  • Thread:
    • 版本 4.5.0
    • 新的实验性特性
      • #9600 异步:添加 task_region
      • #10611 添加 emplace promise::set_value 和 emplace make_ready_future
      • #10826 添加预定执行器操作
      • #11048 添加基于延续的 serial_executor
    • 修复了错误
      • #6787 如果系统时间回滚,boost::thread::sleep() 会挂起
      • #10734 Submit 方法在不同的执行器上工作方式不同,一些抛出异常,一些静默忽略错误(thread_executor 和 inline_executor)
      • #10736 任务异常被静默忽略。我认为来自 N3785 和 std::thread 的 std::terminate 解决方案是更好的选择,并且更一致。
      • #10737 在 serial_executor 中,如果任务抛出异常,我们会无限等待。
      • #10822 Boost.Thread 无法在 Android 上编译
      • #10824 Boost.Thread 1.57 破坏了 Windows XP SP2 及更低版本的兼容性。
      • #10963 future<future<T>>::then 没有实现
      • #10964 future<future<T>>::unwrap().then() 死锁
      • #10968 async() 和 future::then() 返回的 futures 不是阻塞的。
      • #10971 shared_future::get()/get_or() 必须是 const
      • #10972 shared_future::then() 可以多次调用。
      • #10979 当 make_ready_future 参数是 reference_wrapper<T> 时,支持 T& 类型推导
      • #10996 Thread physical_concurrency() 在 Windows 上失败
      • #11035 BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE 未为 Android 定义
      • #11053 附加的代码导致在 run_thread_exit_callbacks 中出现 R6025 - 纯虚函数调用
  • TypeErasure:
    • 修复了使用 MSVC 12 进行编译的问题。
  • TypeIndex:
    • 在支持的平台上添加了链接时断言
  • Units:
    • 修复了具有任意维度的基本单位的问题。
  • Unordered:
    • 修复了使用有状态的、propagate_on_container_move_assign 分配器时的移动赋值 (#10777)。
    • 修复了在计算要分配的桶数时可能发生的溢出问题 (GitHub #4)。
    • 其他小的更改,请参阅 更改日志
  • Variant:
    • 重大更改:编译时检查的 getter 现在默认用于 boost::get<U>(VariantT)boost::polymorphic_get<U>(VariantT) 中。新的 getter 断言类型 U 是可以存储在 VariantT 中的类型之一。定义 BOOST_VARIANT_USE_RELAXED_GET_BY_DEFAULT 以更改默认行为。有关更多信息,请参阅 get.hpppolymorphic_get.hpp 的描述 #547
    • 向 variant 添加了缺少的比较运算符 #8620, #10811
    • 多个文档修复 #10273, #10653
    • 在 Clang 上启用了可变参数模板 #10832
    • 在 C++14 中自动检测访问者的返回类型,这使得可以将 boost::apply_visitor 与通用 lambda 一起使用 #10837
      auto str = boost::apply_visitor(
          [](auto v) {
              return boost::lexical_cast<std::string>(v);
          },
          variant_instance
      );
      
    • 改进了 swap 函数 #10882
    • 对可变参数模板进行了许多改进,更多的方法支持可变参数。
    • 多个错误修复和测试改进,包括 Coveralls 集成

测试的编译器

Boost 的主要测试编译器是

  • Linux
    • Clang: 3.4
    • Clang, C++14: 3.5, 3.6
    • GCC: 4.4.7, 4.9.2
    • GCC, C++98: 4.8.1, 4.8.2
    • GCC, C++11: 4.4.7, 4.8.4, 4.9.2
    • GCC, C++14: 4.9.2
  • Windows
    • GCC, mingw: 4.4.7, 4.5.4, 4.6.3, 4.7.3, 4.8.2
    • Visual C++: 8.0, 9.0, 10.0, 11.0, 12.0
  • FreeBSD
    • GCC: 4.2.1
  • QNX
    • QCC: 4.4.2

Boost 的其他测试编译器包括

  • Linux
    • Clang: 3.0, 3.1, 3.2, 3.3, 3.4
    • Clang, C++14: 3.5, 3.6
    • GCC: 4.4.7, 4.6.4, 4.7.3, 4.8.1, 4.9.2, 5.0.0 (实验性)
    • GCC, C++11: 4.4.7, 4.8.4, 4.9.2
    • GCC, C++14: 4.9.2
  • Windows
    • GCC, mingw: 4.4.7, 4.5.4, 4.6.4, 4.7.3
    • Visual C++: 8.0, 9.0, 10.0, 11.0, 12.0, 14.0
  • Android
    • Clang: 3.4, 3.5
    • GCC: 4.8, 4.9
  • FreeBSD
    • GCC: 4.2.1
  • QNX
    • QCC: 4.4.2

鸣谢

Beman Dawes、Eric Niebler、Rene Rivera、Daniel James、Vladimir Prus 和 Marshall Clow 管理了此版本。