Boost C++ 函式庫

...世界上最受推崇且設計精良的 C++ 函式庫專案之一。 Herb SutterAndrei Alexandrescu,《C++ 程式碼規範

版本 1.85.0

版本 1.85.0

2024 年 4 月 15 日 17:38 GMT

說明文件

下載
平台檔案SHA256 雜湊值
Unixboost_1_85_0.tar.bz27009fe1faa1697476bdc7027703a2badb84e849b7b0baad5086b087b971f8617
boost_1_85_0.tar.gzbe0d91732d5b0cc6fbb275c7939974457e79b54d6f07ce2e3dfdd68bef883b0b
Windowsboost_1_85_0.7z16d16b9658753117c1434e5450c5eac194957f4b6d0b390b9d07900d37c115a4
boost_1_85_0.zipe712fe7eb1b9ec37ac25102525412fb4d74e638996443944025791f48f29408a
* 下載連結由 C++ 聯盟 的補助支持。

已知問題

這些是函式庫作者提供的修補程式,在發佈時發現已為時已晚,無法修復。

  • 容器 (Container)
    • 由於函式庫中的未定義行為 (UB),flat_map/multimap 容器在某些編譯器中可能會崩潰或返回無效結果,請參見 #273修補程式

新增函式庫

  • Charconv: Matt Borland 提供的 C++11 中高品質的 <charconv> 實作。
  • Scope: Andrey Semashev 提供的範圍保護工具集合和 unique_resource 包裝器。

已更新函式庫

  • Asio:
    • 修正了 async_result 主要模板的概念檢查,以正確處理左值限定的完成簽章 (completion signature)。
    • 修正了在使用 bind_allocatorbind_executorbind_immediate_executorbind_cancellation_slot 完成權杖配接器互相調整時可能發生的編譯錯誤。
    • 變更 experimental::ranged_parallel_group 操作,使其在調用完成處理器時移動 completion_order 向量。
    • 修正了關於 ip::basic_resolver_queryio_context::strandcoroutine 上已棄用的隱式複製建構函式的警告。
    • 更新了用於初始化 Winsock 的版本規格。
    • 修正了 co_spawn,以正確地將取消導致的例外傳播到完成處理器。
    • 增加了對 std::launder 的呼叫,以修復 awaitable<> 內部儲存中的未定義行為。
    • 在 Windows 檔案支援的實作中,增加了遺漏的 file_base::append 旗標處理。
    • 更新了 socket 和描述元實作,增加了更多在呼叫 ioctl 失敗時會回退到 fcntl 的情況。
    • 修正了boost/asio/experimental/parallel_group.hpp標頭檔,使其自包含。
    • 修正了在同一個轉譯單元中同時使用通道和 experimental::coro 時發生的編譯錯誤。
    • 在文件中增加了遺漏的 CancellationSlot 類型需求。
    • 修正了非同步操作啟動函數的推導返回類型的文件超連結。
    • 其他次要文件更新。
  • Atomic(原子操作):
    • 在 RISC-V 上新增了對 pause 指令的支援。(PR#65)
  • Beast(網路程式庫):
    • API 變更
      • 狀態碼列表已更新,以符合 IANA 註冊表。
    • 修正
      • buffers_cat.hpp 中無法到達的程式碼警告。
      • websocker_server_awaitable 範例中的連線錯誤處理。
      • 在進階伺服器範例中併發呼叫 async_write
      • zlib 與 minizip 的名稱衝突。
      • SSL_set_tlsext_host_name() 之後應更新主機字串。
    • 改進
      • 針對 bind_wrapperbind_front_wrapper 特製化了 asio::associator
      • 新增錯誤類別訊息函式的非配置重載。
    • 說明文件
      • 指定何時呼叫 http::message::prepare_payload() 是可選的。
      • basic_stream::expires_after() 影響的操作。
      • teardown()async_teardown() 是自訂點。
      • 在第一次使用後移動或複製 http::serializer 是未定義行為。
      • 應在執行 WebSocket 握手之前設定 websocket::permessage_deflate
      • http 讀取操作中的 bytes_transferred 報告 HTTP 解析器消耗的位元組數。
    • 致謝
      • Emile Cormier、JohannesWilde、yhzx233
  • Bimap(雙向映射):
    • 修正了 side collections 的異質查詢 (PR#42)。
  • Bind(繫結):
    • 不再支援 C++03;需要 C++11 編譯器。(這包含 GCC 4.7 或更高版本,以及 MSVC 12.0 (VS 2013) 或更高版本。)
  • Conversion(轉換):
    • 移除過時的 boost::lexical_cast 提及,該函式已不再是程式庫的一部分。感謝 Danil Sidoruk 的 PR PR#28
  • Core(核心):
    • 新增了一個新的 boost/core/functor.hpp 標頭,其中包含一個 functor 類別模板,用於將原始函式包裝到函式物件類別中。
    • 更改了 null_deleterfclose_deleter 和 checked deleter 的定義,使其不會將命名空間 boost 引入依賴於參數的查詢。使用者可能需要明確限定被呼叫函式的命名空間或新增 using 宣告。
  • Filesystem(檔案系統):
    • path::generic_pathpath::generic_string 方法現在會移除返回路徑中的重複目錄分隔符號。
    • v4 版:path::generic_pathpath::generic_stringpath::make_preferredpath::lexically_normal 不再將路徑根目錄名稱中的反斜線和正斜線互相轉換。例如,在 Windows 上,path("\\\\\\\\?\\\\c:\\\\foo").generic_string() 現在返回 "\\?\c:/foo",而不是 "//?/c:/foo"。同樣地,path("\\\\\\\\host/share/foo/..").lexically_normal() 現在返回 "\\host\share"。
    • v4 版:如果兩個路徑其中之一不存在,equivalent 現在會指示錯誤。
    • v4 版:當輸入路徑的 relative_path() 為空時,absolute 現在會返回帶有結尾目錄分隔符號的路徑。(#301
    • 新增了一個 unique_path 多載函式,它接受單個 error_code& ec 參數。該多載函式使用預設路徑模型產生唯一路徑。
    • 如果輸入路徑是相對路徑且不包含檔案系統中存在的任何元素,則 weakly_canonical 現在會產生絕對路徑。(#300
    • copy_filecopy 操作新增了一個新的選項 copy_options::ignore_attribute_errors。這個新選項允許忽略複製檔案屬性時可能發生的錯誤。(#179
    • 在 Linux 上,基於 sendfilecopy_file_range 系統呼叫的 copy_file 後端將嘗試為目標檔案預先分配儲存空間。這可以減少檔案系統碎片,並在可用空間不足時提供早期錯誤指示。並非所有檔案系統都支援此功能;如果不支援儲存空間預先分配,檔案複製仍會繼續進行。
    • 在支援 fdopendiropenat 以及 POSIX.1-2008 中定義的相關 API 的 POSIX 系統上,以及在 Windows 上,recursive_directory_iterator 現在使用檔案描述符/控制代碼而不是路徑來查詢檔案狀態並在迭代期間開啟巢狀目錄。這使得目錄迭代對檔案系統的並行修改更具彈性。
    • 移除先前宣告為已棄用的 API。特別是 pathrecursive_directory_iterator 的成員函式,is_regularcopy_directorysymbolic_link_existscompletecopy_optionsymlink_option,以及 boost/filesystem/convenience.hppboost/filesystem/path_traits.hpp 標頭檔均已移除。文件中提到了移除元件的可能替代方案。
    • 預設情況下,已停用從容器類型(例如 std::vector<char>)建構、賦值和附加 path 的支援。使用者仍然可以透過定義 BOOST_FILESYSTEM_DEPRECATED 來啟用此功能。此功能仍然已被棄用,並將在未來的版本中完全移除。
  • 函式 (Function):
    • 不再支援 C++03;需要 C++11 編譯器。(這包含 GCC 4.7 或更高版本,以及 MSVC 12.0 (VS 2013) 或更高版本。)
  • 幾何 (Geometry):
    • 改進
      • PR#1247 使用 if constexpr 巨集取代條件巨集
      • PR#1242 傳遞策略以按邊排序
      • PR#1234 為 clang/mac/darwin/arm64 新增 cmake 檔案
    • 已解決的問題 (Solved issues)
      • #1231, #1244 修正 CCW 多邊形的無效集合運算
      • #1259 修正使用 CUDA NVCC 編譯器的編譯錯誤
      • #1250 修正線串緩衝區返回錯誤的內部多邊形
      • #1230 修正聯集運算擾動點並返回錯誤結果
      • #1229 修正聯集產生自交
      • PR#1248 透過將封閉叢集中的轉彎設定為不可遍歷來修正緩衝區問題
      • PR#1246 修正轉換器和 is_base_of 的編譯
      • 各種錯誤和警告的修正
  • 迭代器 (Iterator):
    • 對 C++03 的支援已被棄用,並將在未來的版本中移除。
  • JSON:
    • 現在使用 Boost.Endian 來處理位元組序。
    • Boost.System 和 Boost.Container 元件的別名已被棄用,**並將在 1.87.0 版中完全移除**。
    • 所描述類別的轉換支援私有成員。
    • visit 的右值參考重載。
    • 新增對路徑類型轉換的支援。
    • 解析到所描述的類別時,會正確考慮繼承的成員。
    • 已停用自參考序列的轉換。
    • 修正 visit 中的參考處理。
  • LEAF:
    • 用於在线程之間傳輸錯誤物件和異常的新 API:try_capture_all
    • result<T> 能夠傳輸透過 try_capture_all 捕獲的異常。
    • result<T> 傳輸動態捕獲的錯誤物件,效率更高。
    • 舊的 make_shared_context/capture API 已被棄用,將在下一個版本中移除。
    • 移除對在異常中傳輸動態捕獲的錯誤物件的支援。
  • LexicalCast:
    • 大幅重寫內部邏輯,以區分最佳化和基於 C++ 標準函式庫 IO 的串流
      • 現在在更少的情況下建構基於 C++ 標準函式庫的串流,從而**提高效能**;
      • 更少的範本實例化和更簡單的程式碼;
      • 一律使用 std::char_traits(不要使用來自輸入/輸出類型的自定義特性,因為這會導致連結時或執行時錯誤);
      • 修正了前向宣告 boost::array 的誤用(感謝 13steinj 的回報 #64!)
      • 不再支援 volatile 輸入型別,與 C++ 標準函式庫的趨勢一致。
    • 最佳化了從 std::basic_string_view 和 boost::basic_string_view 的轉換 #30
    • 移除對 Boost.NumericConversion 和 Boost.MPL 的依賴。修正了將浮點數類型轉換為算術類型的一些情況。
    • 現在該函式庫可以透過 -fno-sanitize-recover=integer 編譯並正常運作 #45
  • Locale(地區設定):
    • 修正了在 C++20 模式下由於缺少 char8_t 的 typeinfo 導致的連結器問題
    • 修正了使用內建 IConv 的 ICU 時的 IConv 編譯旗標
    • collator 現在會在建構時擲出例外,如果有的話,如文件中所述
    • collator 不再繼承自 std::collator,以避免在目前後端不支援時可能發生的類型混淆 PR#216
    • 當偵測到錯誤的 IConv 函式庫時(例如在某些 MacOS 版本上),會擲出例外,而不是無限迴圈 PR#218
    • date_time 的解析度降低到秒,因為毫秒不易取得,容易造成混淆 #221
  • Math(數學):
    • 新增了一系列最佳化演算法
    • 修正 NCF 生存函數中除以 0 的警告
    • 修正 ccmath::floor/ceil 的 constexpr 深度限制對大型參數失效的問題
    • 提高 quartic_roots 的準確性
    • 修正 libstdc++14 的 cstdfloat 數值限制偵測巨集
    • 修正使用 C++14 時 MSVC UCRT 在 complex.h 中定義 _Complex_I 的問題 PR#1060
    • 改進 cstdfloat iostream PR#1066
    • 修正了在非獨立環境中使用獨立模式時,Boost.Config 巨集的重複定義問題
    • 顯著提升程式碼覆蓋率,並修正相關錯誤
  • MSM:
    • **主要更新**。後端更新 (back11)。需要 C++ 11。文件現在使用它作為預設值。
    • **重要新功能**。新的前端 (PlantUML)。需要 C++ 20
    • 各種錯誤修正(編譯器錯誤和警告、延遲事件的優先順序)
  • Multiprecision(多精度):
    • 修正 C++23 <limits> 的棄用警告 PR#575
    • 修正小位元數的 cpp_bin_float PR#577
    • 修正 -Wpessimizing-move PR#580
    • 新增 covecov 執行
    • 減少 cpp_dec_float 乘法中的截斷 PR#585
    • 修正 complex_adaptor 以符合精度要求 PR#597
    • 修正 tommath 中的重大變更 PR#603
    • 修正可轉換為數字的類型參與算術運算子多載的問題 #608
  • MySQL:
    • **重大變更**: Boost.MySQL 現在需要連結到新的 **Boost.Charconv** 編譯函式庫。這解決了地區設定相依性的問題,提高了效率,並支援新的客戶端 SQL 格式化功能。
    • 新增對**連線池**的實驗性支援,允許重複使用工作階段,並提供內建的重新連線和錯誤處理。
    • 新增對**類型擦除連線**(any_connection 類別)的實驗性支援。 any_connection 不是模板,具有更簡單的連線建立和重新連線語義。
    • 新增了對用戶端 SQL 格式化函式(`format_sql` 和 `format_sql_to`)的實驗性支援。這些函式允許在用戶端安全地組合查詢,實現批次插入、動態篩選或類似 PATCH 的更新等模式。
    • 修復了影響 `close_statement` 和 `async_close_statement` 的效能問題,該問題可能導致應用程式程式碼出現顯著延遲。
    • 新增了使用 `BOOST_ASIO_USE_TS_EXECUTOR_AS_DEFAULT` 進行建置的支援。
    • 已棄用的執行介面(`connection::query`、`connection::start_query`、`connection::execute_statement`、`connection::start_statement_execution` 及其非同步對應項)現在會觸發警告,因為它預計在 Boost 1.86 中移除。
    • 修復了導致某些錯誤訊息被截斷的錯誤。
    • 清理警告。使用 `-Wall` 和 `-Wextra` 進行建置時,建置現在沒有警告。
    • 所有 `field_view` 建構函式現在都穩定。
    • 函式庫內部已使用無 I/O 方法重寫,以降低複雜性。
  • Odeint:
    • 重大變更:函式庫現在明確要求 C++14,而不是透過包含 Boost.Math 隱式要求。
    • 修復與 Thrust 1.10.0 的相容性。
    • 移除 C++03 Boost 元件。
      • Array
      • Bind(繫結)
      • 函式 (Function)
      • Static_assert
  • PFR:
    • `boost::pfr::get_name` 現在可以在某些編譯器上處理區域類型。感謝 Bela Schaum 的 PR PR#152
    • 移除未使用的實作細節。感謝 Denis Mikhailov 的 PR PR#154
    • 允許從 `boost::pfr::structure_to_tuple` 拋出例外狀況。感謝 Denis Mikhailov 的錯誤回報 #155
    • 欄位反射技巧現在已在文件中說明。感謝所有參與 #150 討論的人!
  • Random:
    • 新增 splitmix64 PRNG PR#89
  • System:
    • 不再支援 C++03;需要 C++11 編譯器。(這包含 GCC 4.8 或更高版本,以及 MSVC 14.0 (VS 2015) 或更高版本。)
    • 已移除已棄用的標頭檔 `boost/system/cygwin_error.hpp`。
    • 不再支援原始且過時的(32 位元)MinGW。仍然支援 MinGW-w64(64 位元和 32 位元)。
    • `operator&` 現在適用於 `result<void>`(透過採用空函式的方式)。
    • 為 `result` 新增了 `operator|=`。
  • Stacktrace:
    • 重大新功能:從任意異常獲取堆疊追蹤資訊。在某些 POSIX 平台上,std::stacktrace::from_current_exception() 現在可以返回當前異常物件的堆疊追蹤資訊,如同在拋出異常時擷取堆疊追蹤資訊一樣。非常感謝 Andrei Nekrashevich 在 libsfe 中實現了這個想法的原型。
    • 修復了在 Windows 上使用 boost_stacktrace_windbg 時的記憶體消耗問題。感謝 ycyclop 回報了問題 #111,感謝 Thiago A. Correa 提供更多資訊,感謝 Andrei Karpovskii 提供了可能的修復方案。
    • 修復了在非隱藏可見性下建構函式庫的問題。感謝 Jan Bouwer 的回報以及提供修復方法的資訊。
    • 在文件中新增了一個關於非同步訊號安全的獨立章節。非常感謝 tworonix#131 中強調了這個問題,也感謝 itrofimow 提供關於這個問題的資訊。
  • STLInterfaces:
    • 在 C++20 及之後的版本中,更改了 iterator_interface 對於輸入迭代器的行為,使其更貼近 C++20 的概念。
    • iterator_interface 中移除隱藏朋友,以修復關於概念以不同約束重新定義的錯誤。
    • 新增了一個新的 v3 內聯命名空間,其中包含一個基於推導 this 而不是 CRTP 的新的 iterator_interface(C++23 及之後的版本)。
    • 新增了一個 rvalue 限定的 closure::operator() 多載,以防止暫時物件的懸空。
  • 測試:
    • 遵循函式庫特定的 _NO_LIB 巨集 PR#406
    • 在故意無法到達的程式碼上抑制 MSVC C4702 來自 __builtin_unreachable() 的警告
    • 修復 boost::function 串流錯誤 PR#411
  • Unordered:
    • 針對 value_typeinit_type(如果適用)參數最佳化了 emplace(),以避免建立中間物件。該參數的類型與原本的中間物件類型相同。
    • 針對映射容器上的 k,v 參數最佳化了 emplace(),將物件的建構延遲到確定要插入元素時才進行。當映射的 key_type 是可移動建構的,或者 k 參數是 key_type 時,會進行此最佳化。
    • 修復了對具有顯式複製建構函式的分配器的支援(PR#234)。
    • 修復了 const 版本的 unordered_multimap::find(k, hash, eq) 中的錯誤(PR#238)。
  • Variant:
    • 移除了更多 C++11 之前的巨集和解決方案。
  • Wave 已修復錯誤
    • #200:發出的 pragma 缺少結尾換行符號
    • #202:在 BOOST_WAVE_BSIZE 邊界上呼叫 fill 時,YYMARKER 未更新

已更新工具

已測試的編譯器

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 維護。