Boost C++ 库

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

版本 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 #70, Github PR #71, Github 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 Runtime 的检测以与最新的 Windows SDK 配合使用。
  • Chrono:
    • 版本 2.0.5
    • 修复
      • #10778 VC14 CTP4 Atomic 在使用非 TriviallyCopyable 的 boost::chrono duration 时无法编译
      • #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 位)
    • class 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。有关详细信息,请参阅 changelog
  • Fusion:
    • 自动哈希创建函数 (Github PR #12)
    • 新的 ADAPT_STRUCT、ADAPT_ADT、ADAPT_ASSOC_ 推导出成员类型 (#9516)。
    • 为 Boost.Tuple 和 std::tuple 添加 convert 实现。
    • 为 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)
  • Geometry:
    • 附加功能
      • 新算法 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 在 Value 是包含指向 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 disjoint() L/L 和 L/A 的无效结果。
      • #10959 与 no_rescale_policy 一起使用时,get_turns() 中断言失败。
      • #10960 L/A 的 get_turns() 的无效结果,缺少 turn。
      • #10961 L/A 的 get_turns() 的无效结果,线性尖峰的无效 turn。
      • #11112 由于 CS 名称冲突(在此平台上用于宏),Solaris 上的编译失败
      • #11121 整数坐标的 difference() 的无效结果
    • Bugfixes
      • 多点/多边形、多点/多边形距离计算中的错误(错误检测区域几何图形内部的点)
      • flatten_iterator 的赋值运算符中的错误导致访问冲突
      • 笛卡尔线段-线段相交策略中的错误,当一个线段退化为一个点并且与另一个非退化线段共线时
      • centroid() 中的错误,如果为例如零面积的多边形计算,则结果不确定。
      • 连接点数有限的连接的缓冲区中的错误
      • 锐角周围点数有限的圆形连接的缓冲区中的错误
      • 缓冲区距离大的连接的缓冲区中的错误
      • 点数为奇数的圆形末端的缓冲区中的错误
      • 缓冲区距离大的平端缓冲区中的错误
      • 负缓冲区距离大的内部环缓冲区中的错误
      • 当输入范围为空时,closing_iterator 中的错误无法正常工作
      • is_simple 中的错误,未正确处理多线串中封闭的简单线串
      • rtree 构造函数中的错误,它采用一对迭代器或范围(打包算法),当 Iterator 的引用不是真引用时,使用对已销毁的临时对象的引用,例如对于某些 Range Adaptors。它也影响 distance() 和 comparable_distance()。此错误可能导致 rtree 或 distance() 算法的意外行为,例如断言失败或 SEGFAULT。
      • rtree count() 成员函数中的错误,当传递类型可转换但与 value_type 或 indexable_type 不同的对象时,使用对已销毁的临时对象的引用。如果发生这种情况,可能会返回错误的结果,在大多数情况下为 0。
      • 与 Ranges 的处理相关的错误,阻止在某些算法中使用非容器 Ranges 编译 Geometries(感谢 Samuel Debionne)
  • Hash:
  • Interprocess:
  • Lexical Cast:
  • Log:
    • Bug fixes
      • 修复了线程 id 格式。
      • 修复了进程 id 格式。 (#10926)
      • 修复了 GNU Hurd 上的构建失败。
      • 修复了文本文件接收器后端在文件系统上的可用空间耗尽情况下的不正确行为。接收器将不再创建大量空文件来尝试恢复。 (#11016)
      • 修复了某些情况下 attribute_set::insert() 的不正确行为。插入的元素可能导致某些先前插入的元素无法查找。 (#11106)
      • 修复了如果将大量属性值插入到集合中,attribute_value_set::size() 的不正确行为。 (#11148)
    • 有关更多详细信息,请参阅 changelog
  • Math:
    • 添加了两个新的特殊函数 - trigamma 和 polygamma。
    • 对椭圆积分代码进行了大规模更新,以使用 Carlson 的最新算法 - 这些算法应该比以前更稳定、更准确且稍快。还添加了对 Carlson 的 RG 积分的支持。
    • 添加了 ellint_d、jacobi_zeta 和 heuman_lambda 椭圆积分。
    • 修复了命名空间作用域常量,使其在符合标准的编译器上为 constexpr,请参阅 #10901
    • 修复了不完全贝塔和伽玛函数以及椭圆积分中各种虚假的下溢/溢出情况,感谢 Rocco Romeo。
    • 修复了 3 参数 legendre_p 和 legendre_q 函数,使其在最终参数实际上不是策略的情况下不调用基于策略的重载。
    • 清理了不完全贝塔函数中的一些死代码,请参阅 #10985
    • 修复了极大值 pdf 对于大值输入的问题,请参阅 #10938
    • 切换文档以使用 SVG 而不是 PNG 图形和公式 - 浏览器似乎终于赶上了!
  • Move:
  • Multi-index Containers:
    • 在查找操作涉及生成 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 (每次进行内部比较时都会生成一个)。在足够高级的编译器中,现在避免了这种情况,因此只创建一个临时对象。
    • 维护修复。
  • Multiprecision:
    • 更改了 frexp 以始终是非表达式模板生成,请参阅:10993
    • 改进了 cpp_dec_float 在 Cygwin 和其他缺少 long double 支持的平台上的支持,请参阅 10924
    • 改进了 noexcept 支持并添加了更多测试,请参阅 10990
    • 为 Intel-15.0 和 Solaris-12.4 编译器应用了各种解决方法。
  • Optional:
    • 改进了文档;记录了 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 OS 检测。
    • 修复了 Android 字节序检测。
    • 添加了 predef_check 程序和 BBv2 集成,用于构建配置检查。
  • Random:
    • 添加了 non_central_chi_squared_distribution。
  • Thread:
    • 版本 4.5.0
    • 新的实验性功能
      • #9600 Async: 添加 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() 返回的 future 不是阻塞的。
      • #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 附加的代码导致 R6025 - run_thread_exit_callbacks 中的纯虚函数调用
  • TypeErasure:
    • 修复了使用 MSVC 12 的编译。
  • TypeIndex:
    • 在支持它的平台上添加了链接时断言
  • Units:
    • 修复了具有任意维度的基本单位。
  • Unordered:
    • 修复了具有有状态的 propagate_on_container_move_assign 分配器的移动赋值 (#10777)。
    • 修复了在计算要分配的桶数时可能发生的溢出 (GitHub #4)。
    • 其他小的更改,请参阅 changelog
  • 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 (experimental)
    • 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 管理了此版本。