本家リリースノート:
- https://github.com/boostorg/website-v2-docs/blob/develop/release-notes/boost_1_91_0.adoc
- https://www.boost.org/releases/1.91.0/
リポジトリは以下:
リポジトリからのビルド方法は、egtraさんのブログを参照:
全般的な注意事項
- Boost.StaticAssert が Boost.Config にマージされた。コード、テスト、ドキュメントが対象となる。後方互換性のため、StaticAssert の git submodule、CMake、b2 のターゲットは引き続き利用可能であり、これらのターゲットは単に Config への依存を導入するものとなっている。最終的には、この submodule およびターゲットは削除される予定である。ユーザーは StaticAssert への依存を Config に置き換えるよう更新することが推奨される。C++ コードの修正は不要である。ほとんどの Boost ライブラリはこれに合わせて更新済みである
新ライブラリ
- Decimal
- IEEE754 10進浮動小数点数の実装。作者Matt Borland氏、Christopher Kormanyos氏
更新ライブラリ
- Any
- Asio
- Atomic
- Beast
- Charconv
- Core
- Describe
- DynamicBitset
- Exception
- Filesystem
- JSON
- LEAF
- LexicalCast
- Log
- Math
- MultiIndex
- MSM
- OpenMethod
- Optional
- PFR
- Random
- Redis
- Stacktrace
- System
- Test
- TypeIndex
- Unordered
- URL
- UUID
- Variant2
Any
- CMake における
import stdの検出を修正 boost::anys::basic_anyの実装を簡素化
Asio
- インライン名前空間によるオプションのバイナリバージョニングを追加。同一プロセス内で複数の Asio バージョンがシンボル衝突なく共存できるようになった
- Windows のデフォルトのミューテックス実装を
CRITICAL_SECTIONからSRWLOCKに変更 std::atomicに基づくslimミューテックス実装を追加。これによってstrand、ソケット、その他のディスクリプタの状態サイズを削減- Cygwin64 でのコンパイルをサポート(
__USE_W32_SOCKETSなしを含む) - Asio ヘッダのインクルード前に
BOOST_ASIO_DECLをオーバーライドできるようにした - NetBSD における
MSG_NOSIGNALの扱いを修正 boost_systemへのリンクをサポートしなくなった最近の Boost バージョンにおけるビルドを修正- 古い Android 上の musl libc との互換性を修正
- 古い Apple プラットフォームでの
std::aligned_allocの検出を修正 - MSVC における
serial_port_base::character_size::storeの警告を修正 - ドキュメントにおいて
ip::multicast::outbound_interfaceの IPv4 と IPv6 のセマンティクスを明確化 - TLS v1.3 のコンテキスト初期化を更新し、LibreSSL サポートを正しく検出するよう変更
X509のconst性に関する最近の OpenSSL API 変更との互換性を修正- 詳細は 改訂履歴 を参照
Atomic
- GitHub #79 Apple コンパイラ使用時の PowerPC における
thread_pauseのコンパイルを修正
Beast
inflate_with_ebにおける型キャスト警告を修正- チャンクヘッダに8KBのサニティ制限を適用
- テストにおけるOpenSSLの依存をオプション化
- Boost.StaticAssertへの依存を削除
- HTTP フィールド列挙型に
HTTP2-Settingsを追加
Charconv
- 絶対値が 2^64 未満の負の 128 ビット整数に対する
to_charsのオーバーフローを修正
Core
- GitHub #90 ヘッダ
boost/is_placeholder.hppを Bind から Core へ移動
Describe
- C++20 において、囲むクラスがまだ不完全な場合でも、記述されたネストされた列挙型が動作するようになった(Julien Blanc氏の貢献)
enum_to_stringをconstexpr化(Julien Blanc氏の貢献)
DynamicBitset
operator-( const bit_iterator_base< Iter > & lhs, const bit_iterator_base< Iter > & rhs )に対する不足していた friend 宣言を追加- 生ポインタをイテレータとして使用する標準ライブラリ実装でのコンパイルを修正
from_block_range()がビットセットの未使用部分にビットを設定しないよう修正
Exception
- カスタマイズ可能なシリアライゼーション API を追加。Boost.JSON および nlohmann/json の組み込みサポート付き
Filesystem
- Boost.Filesystem が独自のプラットフォームマクロ
BOOST_FILESYSTEM_POSIX_APIおよびBOOST_FILESYSTEM_WINDOWS_APIを定義・使用するようになった。従来のBOOST_POSIX_APIおよびBOOST_WINDOWS_APIマクロは引き続き Boost.System が定義する。Boost.Filesystem は2つのマクロセットが一致しているかをチェックし、デフォルトでは一致しない場合にコンパイルを失敗させる。BOOST_FILESYSTEM_ALLOW_SYSTEM_API_MISMATCHを1に定義することでコンパイルエラーを警告に軽減でき、2に定義することで完全に無効化できる。ただしこの場合、Boost.Filesystem が返すエラーコードの値はエラーカテゴリと一致しない点に注意 openatおよび関連 API をサポートしない POSIX プラットフォームにおいて、recursive_directory_iteratorのインクリメント時、シンボリックリンク追跡が無効な状態で破損したシンボリックリンクに遭遇した際に報告されるエラーを修正- Cygwin ユーザー向けの破壊的変更: ライブラリが Cygwin を POSIX プラットフォームとして扱うようになった。これにはユーザー視点でいくつかの影響がある。特に以下の通り:
path::value_type型がwchar_tからcharに変更された。他の POSIX プラットフォームと同様に、ワイド文字パスはpath::imbueで設定されたロケールを用いてナロー文字エンコーディングに変換される。Cygwin は Windows 上で動作するため、内部的にも文字コード変換を行う点に注意。Cygwin 環境のロケールが正しく設定されていることが重要である- パス構文が POSIX 規約に従うようになり、Windows 固有のパス(UNC パス、ドライブ名、パスプレフィックスなど)はサポートされない
- API の Windows 固有部分の一部にアクセスできなくなる。リパースポイントは Windows 専用機能であるため、
file_type::reparse_fileはファイルに対して報告されなくなる。リパースポイントの処理は Cygwin ランタイムの動作に依存する - Cygwin は独自のシンボリックリンク実装を持ち、Windows ネイティブのシンボリックリンクとは互換性がない。Boost.Filesystem は Cygwin のシンボリックリンクを作成・操作するようになる
- Boost.Filesystem が返すエラーコードは POSIX
errno値を使用するようになる
- DragonFly BSD、NetBSD、Solaris において、Boost.Filesystem のデフォルトパスロケールがパス文字エンコーディングに UTF-8 を使用するようになった
- Linux において、従来ブラックリストに登録されていたファイルシステムに加えて、configfs、securityfs、cgroup、cgroup2 ファイルシステムに対しても
copy_fileおよびcopyでread/writeループ実装を使用するようになった
JSON
std::initializer_listからのvalueの構築をvalue_fromを使用するよう変更
LEAF
- カスタマイズ可能なシリアライゼーション API を追加。Boost.JSON および nlohmann/json の組み込みサポート付き
- Windows 上で DLL 境界を越えた LEAF エラーオブジェクトの使用をサポート(デフォルトでは無効)
- 内部 TLS API の改善(例: Win32、組み込み)
- 診断システムおよび
on_error実装の改善 - 実装品質の改善(例:
noexceptのより正確な使用) - 非推奨の
verbose_diagnostic_infoを削除(diagnostic_detailsに置換済み)
LexicalCast
- C++20 モジュール
boost.lexical_castの初期バージョンを実装
Log
- Cygwin におけるプロセス間通信サポートのビルドをデフォルトで有効化
Math
non_central_f_distributionに対するパラメータ探索関数find_non_centralityを追加non_central_t_distributionに対するパラメータ探索関数を追加- 不完全ガンマ関数の対数を求める関数
lgamma_qを追加 - 下側不完全ガンマ関数の対数を求める関数
lgamma_pを追加 pchipにdomain()関数を追加- ロジスティック分布で壊れていた CUDA サポートを修正
- Windows on ARM64 における不正な浮動小数点 traits を修正
- 大きな引数に対する
ibetaの不正な結果を修正 phi引数がN * PI / 2のときのellint_2の不正な結果を修正- NVCC の存在に基づいて CUDA を想定するのではなく、ユーザーに対して CUDA の明示的な有効化を要求するよう変更
MultiIndex
- 破壊的変更: ライブラリが受け入れまたは提供するすべての型リスト(
indexed_by、tag、ネストされた typedefindex_specifier_type_list、index_type_list、iterator_type_list、const_iterator_type_list)が Boost.MPL ベースではなくなり、Boost.Mp11 リストに変更された。これにより、Boost.MultiIndex は Boost.MPL に依存しなくなった。ほとんどのユーザーコードには影響しないと考えられるが、マクロBOOST_MULTI_INDEX_ENABLE_MPL_SUPPORTをグローバルに定義することで従来の動作を復元可能。Boost.MPL のレガシーサポートは将来的に非推奨化および削除される可能性がある - 破壊的変更:
composite_keyおよび関連クラステンプレート(composite_key_equal_to、composite_key_compare、composite_key_hash)が可変引数テンプレートに変更された(従来はテンプレート引数の最大数がBOOST_MULTI_INDEX_LIMIT_COMPOSITE_KEY_SIZEで制限されていた)。この変更はユーザーに対して透過的であるべきだが、composite_key::key_extractorsがboost::tupleではなくstd::tupleを返すようになった点が例外である(影響を受ける他のクラステンプレートも同様) - C++11 以前のコンパイラをサポートするための内部回避策とフォールバックを削除
MSM
- 新機能 (
backmp11):- GitHub #173: 階層的ステートマシンにおける
deferred_eventsプロパティのサポートを改善 - GitHub #155:
deferred_eventsプロパティによる条件付き遅延をサポート - GitHub #175: 関数オブジェクトのシグネチャを簡素化
- GitHub #168: キューイングされたイベントと遅延イベントを単一のイベントプールに統合
- GitHub #172: イベントプール内のイベントに対する小オブジェクト最適化
- GitHub #180:
flat_foldディスパッチ戦略による実行時パフォーマンスの改善 - バージョン 1.90 と比較して、最大 25% のコンパイル時間短縮と RAM 消費量の削減をさらに最適化
- GitHub #173: 階層的ステートマシンにおける
- バグ修正 (
backmp11):- GitHub #167:
on_entry(...)およびon_exit(...)呼び出し時の不正なFSM型を修正 - GitHub #166: 完了イベントが過剰に発火する問題を修正
- GitHub #200: 階層的ステートマシンにおける遷移が正しく選択されない問題を修正 (favor_compile_time)
- GitHub #205:
state_machineがムーブできない問題を修正
- GitHub #167:
- 破壊的変更 (
backmp11): イベントプールへの直接アクセスをpublicからprotectedに変更。ライブラリコード外からの操作は未定義動作を引き起こす可能性があるため
OpenMethod
boost::intrusive_ptrとの相互運用
Optional
- 完全な C++11 サポート(「制限なし共用体 (unrestricted unions)」と参照修飾子を含む)を持つコンパイラにおいて、実装をaligned storageからunion storageに変更。これにより段階的な
constexprサポートが可能になった:- C++11 では、一定の制約を満たす型に対し、一部のコンストラクタおよび
const修飾付きアクセッサがコンパイル時コンテキストで使用可能になった(コア定数式) - C++14 では、一部の変更操作もコア定数式になった(
optionalの状態を「値なし」から「値あり」に変更する操作を除く)。これは協調型に対して適用される - C++17 では、すべてのコンストラクタ(コピーおよびムーブを含む)が協調型に対してコア定数式になった
- これは GitHub #132 および GitHub #143 に対応する
- C++11 では、一定の制約を満たす型に対し、一部のコンストラクタおよび
- 破壊的変更:
swapのカスタマイズ機構を廃止。このメカニズムはほとんど知られておらず、ドキュメント化もされていなかった std::optionalのインタフェースに近づけるための小さな変更:- optional オブジェクトを「値なし」状態にするための構文
o = {}を有効化 - デフォルト構築された
Tを使用する構文o.value_or({})を有効化 o = u(oはoptional<T>型、uはTに変換可能なU型) の構築において一時的なTを生成しないよう変更
- optional オブジェクトを「値なし」状態にするための構文
- GitHub #142
optional<T>&からoptional<T&>への変換を追加 none_tがstd::equality_comparableになり、none_tとoptional<T>がstd::equality_comparable_withコンセプトをモデル化するようになった(std::equality_comparableなTに対して)。これにより、optional オブジェクトの範囲に対してstd::ranges::find(rng, boost::none)が使用可能になった- 警告: 将来のリリースで
optionalにRangeインタフェースを導入する予定であり、std::ranges::range<optional<T>>がtrueになる。これはstd::ranges::rangeなどの述語に基づいて判断するプログラムのオーバーロード解決に影響する
template <typename T> void serialize(T const& v) { if constexpr (std::ranges::range<T>) serialize_as_range(v); else if constexpr (custom::is_optional_like<T>) serialize_as_optional(v); else serialize_as_value(v); }
PFR
- 実験的な C++26 リフレクションベースの実装を追加。有効にするにはマクロ
BOOST_PFR_USE_CPP26_REFLECTIONを1に定義する boost::pfr::for_each_field*()関数が状態をもつビジターで正しく動作するようになった
Random
binomial_distributionにおいて符号なし整数型が意図せずサポートされていなかった問題を修正
Redis
- GitHub #345, GitHub #391, GitHub #237 Sentinel デプロイメントの組み込みサポートを追加。
config::sentinelを使用して設定可能。ライブラリがマスター/レプリカの検出、エラー検出、再接続を自動的に処理する - GitHub #340, GitHub #356, GitHub #358, GitHub #378, GitHub #383, GitHub #263
generic_flat_responseを追加。flat_responseの高性能な代替であり、連続メモリを使用し定常状態ではアロケーションがゼロになる。Nikolai Vladimirov氏のPRに感謝 - サーバープッシュ処理の全般的な改善:
- GitHub #375, GitHub #367 サブスクリプション追跡のサポートを追加。再接続のたびにアクティブなサブスクリプションを復元する。
request::subscribe、request::psubscribe、request::unsubscribe、request::punsubscribeを使用してアクセス可能 - GitHub #390, GitHub #349
push_parserを追加。PubSub関連メッセージのパースを容易にするビュー - GitHub #381, GitHub #340, GitHub #331
connection::async_receiveおよびconnection::receiveを非推奨化。より高速なバッチ処理が可能なasync_receive2の使用を推奨 consume_oneを非推奨化。代わりにgeneric_flat_response::clearの使用を推奨。詳細は PubSub の例を参照- ドキュメントと例を改善
- GitHub #375, GitHub #367 サブスクリプション追跡のサポートを追加。再接続のたびにアクティブなサブスクリプションを復元する。
- GitHub #392
config::username、config::password、config::client_name、config::database_indexを非推奨化。代わりにconfig::setupの使用を推奨。セットアップリクエストの構成を簡素化するrequest::helloおよびrequest::hello_setnameを追加 - GitHub #389, GitHub #395 ログメッセージのレベルをより適切に調整: 設定およびネットワークエラーに
level::error、接続成功にlevel::info、詳細出力にlevel::debug - GitHub #342, GitHub #341
request::append()を追加。リクエストオブジェクトを連結する - GitHub #363, GitHub #360
std::tuple要素を持つ範囲を渡した場合にrequest::push_rangeが不正なコマンドを生成する問題を修正 - GitHub #364, GitHub #361 パブリックヘッダから
<ostream>を削除し軽量化
Stacktrace
- 互換性のないランタイムに対するコンパイル時チェックを削除。これにより誤検知がなくなり、
from_exception機能がそのまま動作するようになった。互換性のない/リークするランタイムのまれなケースはランタイムで報告されるようになった - GitHub #219 cygwin で
from_exceptionを無効化。David McFarland氏の PR に感謝 has_addr2lineの C++ 標準ライブラリとのリンクを削除し、システムデフォルトでないlibstdc++.soでのビルドを簡素化
System
operator|(result<T&>, U)の戻り値型を非参照に変更r & fでメンバへのポインタをサポート(boost::compat::invokeを使用)- ライブラリがヘッダオンリーであるにもかかわらず、CMake config ファイルをインストールするようになった。これは
find_package(Boost COMPONENTS system ...)を含むサードパーティのCMakeLists.txtファイルの破壊を回避するため - C++20 以降で
error_codeがさらにconstexpr化 resultにunsafe_valueを追加result<>::operator*およびresult<>::operator->が!has_value()の場合に例外をスローするよう変更(従来は事前条件)。従来の動作はunsafe_value()で記述boost/system/unwrap_and_invoke.hppを追加
Test
- GCC 10 未満における
std::optionalの適切な比較のためのフレンド演算子を追加
TypeIndex
- C++20 以降の CTTI 型比較を最適化
ctti_type_index::name()が C++14 以降のモダンな C++ 標準でデフォルトで整形された値を返すよう変更。ライブラリバイナリのサイズを削減
Unordered
- GitHub #344 並行コンテナにおける範囲挿入の戻り値を修正
URL
- 機能追加:
- GitHub #976 すべてのパース関数が C++20 で
constexprになり、コンパイル時の URL パースおよび検証が可能になった - GitHub #953 クエリコンテナに
get_orを追加。キーが存在しない場合にデフォルト値を返す - GitHub #952 スタンドアロンの
decodeおよびdecoded_sizeフリー関数を追加 - GitHub #950
grammar::rangeに対するユーザー提供のRangeRuleサポートを追加。カスタム文法規則を利用可能 - GitHub #966 すべてのビュー型に対して
std::ranges::enable_borrowed_rangeを特殊化 - GitHub #964
token_rule_tに EBO およびデフォルト構築を追加 - GitHub #962 セグメント用の natvis ビジュアライザーを追加
- GitHub #976 すべてのパース関数が C++20 で
- パフォーマンス:
- GitHub #969 内部 URL オフセットを
size_tからuint32_tに変更。64 ビットプラットフォームでのオブジェクトサイズを削減
- GitHub #969 内部 URL オフセットを
- 修正:
- GitHub #986
..解決によるnormalize_pathのあいまいさを修正 - GitHub #949 空の
string_view入力に対するparse_queryのガード追加 - GitHub #978
=を含む値に対するparams_iter_impl::decrement()のデコード後サイズを修正 - GitHub #978
decode_view::remove_prefix/remove_suffixのアサーションを修正 - GitHub #963
pct_string_view::operator*()に対するdecode_viewの完全性を修正 - GitHub #959 サンプルのルーターをムーブ専用に変更
- GitHub #981
tuple_ruleにおける GCC の偽陽性-Wmaybe-uninitializedを修正 - GitHub #982, GitHub #988 Laurel Lye Systems Engineering によるセキュリティレビュー: 3 ラウンドの評価、21 件の確認済み修正、パブリックインタフェース境界テストおよび fuzz テストを追加
- GitHub #986
- ドキュメント:
- GitHub #987 設計根拠のページを追加
- GitHub #970 プラススキーム規約をドキュメント化
- レガシーの QuickBook ドキュメントを削除
UUID
boost/uuid/uuid_io.hppにfrom_charsを追加string_generatorにnoexceptなoperator()オーバーロードを追加string_generatorがcharとwchar_tに加えて Unicode 文字型をサポート- C++14 以降かつ最近のコンパイラにおいて、ほとんどの
uuidアクセサ・操作・to_charsが可能な限りconstexprになった to_charsの SIMD 実装を追加。UUID のフォーマットで最大 5.5 倍のパフォーマンス改善(Andrey Semashev氏)from_charsの SIMD 実装を追加。UUID のパースで最大 13 倍のパフォーマンス改善(Andrey Semashev氏)boost/uuid/uuid_io.hppにuuid_from_stringを追加- 後方互換性のために
std::runtime_errorから派生した専用のinvalid_uuid例外クラスを追加
Variant2
holds_alternative<T>およびget<T>が、Tが代替型のリストに正確に1回出現する必要がなくなり、少なくとも1回出現すればよいよう緩和された
テスト済みコンパイラ
主要なテストコンパイラ:
- 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