本家リリースノート:
- https://github.com/boostorg/website/blob/master/feed/history/boost_1_77_0.qbk
- http://www.boost.org/users/history/version_1_77_0.html
リポジトリは以下:
リポジトリからのビルド方法は、egtraさんのブログを参照:
新ライブラリ
- Describe C++14のリフレクションライブラリ (作者Peter Dimov)- このライブラリは、列挙子と、構造体・クラスのメンバを記述するためのマクロ、およびそれらの情報を照会するプリミティブを提供する
 
- Lambda2 C++14の、依存ライブラリのない、シングルヘッダのラムダライブラリ (作者Peter Dimov)- _1 + 5,- _1 % 2 == 0,- _1 > _2, or- _1 == ' ' || _1 == '\t'のような式を介して単純な関数オブジェクトを構築する
 
更新ライブラリ
- Any
- Asio
- Atomic
- Beast
- Conversion
- Core
- DLL
- Filesystem
- JSON
- LexicalCast
- Log
- Mp11
- Multi-index
- PFR
- PropertyTree
- System
- Uuid
更新ツール
Any
- boost::anys::basic_anyを追加。これはカスタマイズ可能なSmall Object Optimizationを備えたデータ型で、- ValueType要件を満たす任意の型のインスタンスを保持できる (Ruslan Arutyunyan @rarutyun氏に多大な感謝)。これが本当に必要かどうかがわからない方は、代わりに- boost::anyを使用してほしい
- GitHub Actions CIによる追加のテストを開始
Asio
- 個々の非同期操作のキャンセルをサポート
- associatorトレイトを追加。ジェネリックな転送アソシエータとして使用する
- Asioに実装されているすべての非同期操作を変更し、それらの完了ハンドラを右辺値参照として呼び出すようにした。これにより、右辺値参照修飾を関数呼び出し演算子に追加できる (R operator()(Args...) &&;)
- 非同期操作に複数の完了シグニチャのサポートを追加
- awaitable<>に- operator&&と- operator||を追加。これによって、コルーチンを並列にtrivially awaitedできるようにした
- experimental::as_tuple完了トークンアダプタを追加
- experimental::append完了トークンアダプタを追加
- experimental::prepend完了トークンアダプタを追加
- experimental::deferred完了トークンを追加。これは非同期操作の遅延実行を許可する
- experimental::parallel_groupクラスと- experimental::make_parallel_group関数を追加
- experimental::promiseを追加。これは非同期操作の即時実行 (eager execution) と同期を許可する
- experimental::coroクラステンプレートを追加。これは非同期の待機 (- co_await) と生成 (- co_yield) の両方を組み合わせる機能をもつC++20コルーチンのプリミティブ
- ssl::stream<>にムーブ代入演算子を追加
- co_spawnのコルーチンの最初のステップをexecutorに- dispatchするよう変更
- 非同期操作で使用する際の、any_executorとany_io_executorの追加の最適化を有効にした
- awaitable<>に- nodiscard属性を追加
- デフォルトのリサイクルアロケータで、キャッシュされるスロットの数を増やした
- over-alignedな型をサポートするために、アライメント要件を尊重するようデフォルトのアロケータの動作を変更
- 結果の文字列が常に逆の名前解決で初期化されるようにした
- use_awaitable_t::executor_with_defaultでの再帰的なテンプレートインスタンス化の問題を修正
- 対象のexecutorの基づいて正しく結果を返すようany_io_executorの等値比較演算子を修正
- ムーブ元のexecutorを使用しないようstrand<>を修正
- コンパイラの機能を検出する際に、GCCのテストがClangで使用されないよう修正
- MSVCに同梱されているClangでコルーチンのサポートを無効化
- OPENSSL_NO_SSL_INTERNが定義されている場合の、最近のLibreSSLとの互換性を修正
- posix::basic_stream_descriptorのムーブ操作が、非デフォルトのexecutorで動作するよう修正
- より詳細な更新内容は、ライブラリのリリースノートを参照
Atomic
- アトミック参照オブジェクトを構築するために、make_atomic_ref()、make_ipc_atomic_ref()ファクトリ関数を追加
- atomic_refクラスと- ipc_atomic_refクラスにC++17のテンプレート引数推論ガイドを追加し、コンストラクタ引数から推論できる場合にテンプレート引数を省略できるようにした
Beast
- このメンテナンスアップデートは、小さなバグ修正と、CI報告の更新を含む
- 修正- GitHub #2139 test_streamに、executorをrebindする機能を追加
- WebSocketのasync shutdownでの未使用変数の警告を修正
 
- GitHub #2139 
- 改善- GitHub #2124 Beastで浮動小数点数のサポートを要求しないようにした
- すべての操作においてcommon buffers typeを使用することにより、websocketyのコンパイルされたコードのサイズを削減
- HTTP Parserの間違った使い方の検出を改善
 
- その他- GitHub #2140 ライブラリのメタデータにcxxstdタグを追加
- Drone CIに移行
- ドキュメントの小さな書式を改善
- CMLは、in-treeビルド中に必要なBoost Thread Libraryを見つけられるようになった
 
Conversion
- GitHub #25 boost::implicit_castをconstexprに対応
- GitHub #23 壊れたリンクを修正
- GitHub Actions CIによる追加のテストを開始
Core
- GitHub #92 boost/core/uncaught_exceptions.hppをMac OS 10.4以下と互換性をもつよう変更
DLL
- boost::dll::library_infoでの、不正な形式のELFの実行時チェックを強化
- .symtabが空もしくは不足している場合に、- boost::dll::library_infoは- .dynsymELFセクションから情報を使用する
- GitHub #50 インポート可能なboost::dll::library_info内のprotectedなELFシンボルをリスト化
- GitHub #49 POSIX環境でのwchar_tからcharへの不要な変換をなくした (Vladislav Shchapov氏に感謝)
- GitHub Actions CIによる追加のテストを開始
Filesystem
- Boost.Filesystem v4の導入- この新しいバージョンでは、v3で非推奨だった機能を削除し、C++17のstd::filesystemライブラリとの互換性を高めることを目的としたAPI変更も行う。差異は v3 タグと v4 タグを使用してリリースノートとドキュメントきに記載されており、セクション内でもまとめられている
- ユーザーは、コンパイル時にBOOST_FILESYSTEM_VERSIONマクロの値を3か4にすることでバージョンを選択できる。ライブラリのバージョンごとにBoost.Filesystemをコンパイルする必要はない。ひとつのバイナリでv3とv4の両方がサポートされる
- 細かな差異によるバグが発生する可能性があるため、ユーザーは同じアプリケーションでv3とv4の両方を使用しないようにする必要がある
- 現在はv3がデフォルト。将来のリリースではv4がデフォルトになり、最終的にはv3は削除される
- v4は機能するがまだ作業中であり、将来的にAPIに大きな変更が行われる可能性がある
 
- v4 : GitHub #88, GitHub #194 path::filename、path::stem、およびpath::extensionはパスがこれらのコンポーネントのみで構成される場合に、パスのルート名・ルートディレクトリをファイル名と見なさなくなった- 例としてWindowsではpath("C:").filename()は"C:"を返すために使用され、path("C:\\").filename()は"\"を返すために使用されたが、これらは空のパスを返すようになった
 
- 例としてWindowsでは
- v4 : GitHub #88 path::stemとpath::extensionはドットではじまり、ほかのドットがないファイル名と拡張子として扱わなくなった。ドットではじまるファイル名は通常、拡張子が空のファイル名として扱われる。先頭のドットは、ほとんどのUNIX系システムで隠しファイルを表すために使用される
- 新機能 : Windowsでのパスのさまざまなプレフィックスのサポートを改善- ローカルデバイスサフィックス ("\\.\") のサポートとNTパスプレフィックス ("\??\") の実験的サポートを追加
- プレフィックスは、パスのルート名に含まれる
- v3でプレフィックスを使用すると意外な結果になってしまう可能性があるため注意 (例としてpath("\\\\.\\").stem() == "\\\\")。プレフィックスはv4でのみ使用することを推奨
 
- ローカルデバイスサフィックス (
- 正規化されたパスに複数のドット (".") が残ってしまういくつかのケースを排除するために、path::lexically_normalの実装をやり直した
- 新機能 : GitHub #172 Linuxでのシステムコールstatxとgetrandomの実行時検出を追加。これはsyscallがコンパイル時に存在するが実行時にENOSYSで失敗する場合に役立つ (たとえば、ホストで使用可能であってもsyscallを制限するDockerコンテナ内など)
- 新機能 : ライブラリのビルド時にさまざまなシステムAPIの使用を無効化するサポートを追加- これは特定のAPIがライブラリのコンフィグレーションスクリプトでは存在するものとして検出されたが、なんらかの理由で使用してはならない場合 (たとえば実行時検出がターゲットシステムで機能しない場合など) に役立つ
- 詳細はライブラリドキュメントのコンフィグレーションマクロの説明を参照
 
- 新機能 : GitHub #186 copy_file操作にオプションとしてcopy_options::synchronize_dataとcopy_options::synchronizeを追加。- これらを使用すると、書き込まれたデータと属性と永続ストレージと同期できる。これらはパフォーマンスとしては高価になるが、コピーされたデータの信頼性を確保できる
- Boost 1.74.0以降では、POSIXシステムで暗黙的にデータ同期を実行していたことに注意。このリリースでは、より多くのプラットフォームのサポートが追加され、呼び出し元が明示的に要求できるようにし、デフォルトではデータ同期が無効になった
 
- 内部で発行された一部のシステムコールの、POSIXでのEINTRエラーコードの処理を追加。とくにcloseではEINTRが無視される可能性があり、HP-UXではfile descriptorがリークする可能性がある
- GitHub #184 Linuxのシステムコールsendfileとcopy_file_rangeに基づくcopy_fileの実装では、特定のファイルシステムがそれらのシステムコールをサポートしておらず、一般的なread/writeループにフォールバックすることを示すエラーコードの処理を追加した。これにより、eCryptFSおよび場合によってはほかのファイルシステムで失敗するcopy_fileが修正されるはずである
- copy_file_rangeシステムコールはこれまでLinux 5.3以降でのみ有効になっていたが、Linuxカーネル4.5以降から使用されるようにした。- copy_file_rangeがファイルシステム間でファイルのコピーに失敗した場合、- copy_fileの実装は- sendfileまたは- read/- writeループにフォールバックする
- Linuxのシステムコールsendfileとcopy_file_rangeに基づくcopy_fileの実装は、生成されたコンテンツを含むファイルを含むことがわかっているファイルシステムでは使用されないようにした。これらのシステムコールはそのようなファイルと互換性がなく、コピーするとファイルサイズがゼロになる。代わりに、一般的なread/writeループが使用される。現在、ブラックリストに登録されているファイルシステムは以下:procfs, sysfs, tracefs, debugfs
- read/- writeループに基づく- copy_fileの実装では、一時ストレージに使用されるバッファの最大サイズを増やし、より最適なパフォーマンスを得られるようターゲットとなるファイルシステムのブロックサイズを考慮に入れるようにした
- Windows CEでは、プロセスの現在のパスを取得するためにcurrent_pathを使用した場合に、ルートパスを正常に返す代わりに、エラーで失敗させるようにした。このプラットフォームはcurrent pathをサポートしていない。current pathの変更は、以前のこのライブラリのバージョンでも同様に失敗していた
- canonicalで、ルートより上のディレクトリをシンボリックリンクで参照してしまう問題を修正。これはシンボリックリンクが元のパスと異なるルートをもつ絶対パスに解決してしまった場合に起きていた
- canonicalに、コール中に解決できるシンボリックリンクの最台数制限をもたせた。その制限は現在のところ、少なくとも40となっている
- GitHub #87, GitHub #187 Windowsでは、canonicalとweakly_canonicalは、結果となるパスのルートディレクトリの区切り文字にpath::preferred_separatorを使用するようにした。これにより、Windows APIがUNCパスおよびWin32ファイルシステムプレフィックス ("\\?\") ではじまるパスで汎用区切り文字 ("/") を処理しないために発生する「ファイルが見つかりません」エラーが修正される
- 新機能 : weakly_canonicalにbaseパスを引数にとるオーバーロードを追加
- GitHub #201 Windowsでは、ファイルシステムに存在しない要素が入力パスに含まれているが、後続のドットドット ("..") 要素によってキャンセルされた場合に、weakly_canonicalがエラーで失敗することがなくなった。例としてweakly_canonical("C:\\a\\..")は失敗していた
- GitHub #187 Windowsのread_symlinkで再解析ポイントのハンドリングを正しくした。この操作は、いくつかのマウントポイント (例としてBoxのクラウドストレージドライバによって生成されたもの) および空の印刷名 (print name) をもつディレクトリのジャンクションポイントで、空のパスを返す。新しい実装では再解析ポイントの代替名を解析し、そこからWin32パスを再構築するよう試みる
- GitHub #181 Windowsでは、boost/filesystem/fstream.hppで提供されるファイルのストリームは、標準ライブラリがワイド文字でパスを開くことをサポートしている場合に、libc++のバージョン7.0以降でワイド文字パスを使用する
- Windowsでは、Windowsが開発者モードで構成されている場合、シンボリックリンクの生成に昇格された特権は必要なくなった
- いくつかのコンパイラでは、Boost.Filesystemの内部で使用されるグローバルオブジェクトは、ユーザーのグローバルデストラクタが呼び出されたあとに破棄されるようになった。これにより、プログラムの終了段階でBoost.Filesystemの機能を呼び出せるようになった。これはとくに文字コード変換で起き、path::imbueによるパスのロケール変更に影響する。サポートされるコンパイラは、MSVC、GCC、Clangのほか、#pragma section(MSVC互換コンパイラ) もしくは__attribute__ ((init_priority))(GCC互換コンパイラ) によるプログラム初期化順序のカスタマイズをサポートするコンパイラが含まれる
JSON
- value_toに- TupleLike型のサポート
- value_toと- value_fromに- std::arrayとそれに似た型のサポート
- stringから- string_viewへの暗黙の型変換演算子
- std::hashをjson型で特殊化
- objectと- key_value_pairのアロケーションエラーを修正
- 空の範囲をもつイテレータのペアからarrayを構築する際にクラッシュする問題を修正
LexicalCast
- intの表現可能な範囲外な値をもつ浮動小数点数の- intへの代入を修正
- GitHub Actions CIによる追加のテストを開始
Log
- GitHub #150 riscv32ターゲットのコンパイルを修正
Mp11
- mp_intersperse,- mp_split,- mp_joinを追加
Multi-index
- メンテンス作業
PFR
- 衝突数を減らしboost::pfr::hash_value()の品質を向上させるため、MurMur Hashベース実装のhash_combine()を使用するようにした
- Visual Studio 2017のC++14モードをサポート (Denis Mikhailov @denzor200氏に感謝)
- inspect toolによって発見した問題を修正
- GitHub #72 include/boost/pfr/detail/fields_count.hpp内の不要なセミコロンの削除など、いくつかの警告を修正
- 継承型のコンパイル時アサートを追加 (Denis Mikhailov @denzor200氏に感謝)
- コピー省略が保証されている場合の、ムーブ不能なフィールドをもつ集成体のリフレクションが可能になった
- スペルミスを修正
- GitHub Actions CIによる追加のテストを開始
PropertyTree
- 今回はメンテナンスリリース
- CIでのコンパイラのカバレッジを拡張
- CMakeLists.txtでのBoostの互換性を修正
System
- error_categoryから- std::error_categoryへの変換演算子を改善し、- <map>と- <mutex>が必要なくなった
- error_categoryの比較演算子をメンバ関数の代わりにインラインのfriendにした (↑の変更の副作用)
- error_conditionは実際にオブジェクトのインスタンス化が必要になるまで- generic_category()の呼び出しを遅らせるようにした
- error_condition::failedと- error_condition::messageを非推奨ではなくした。また、- operator bool()も- failed()を返すようにした
- system categoryにおいてオブジェクトのインスタンス化を回避するためにgeneric_category()を呼び出すのをやめた
- default_error_conditionで返される値は、いくつかのケースでsystem categoryではなくgeneric categoryに変わる場合がある。これは、入力となるsystem categoryの- error_codeに合致する- errc_tがない場合にPOSIX環境で起こる
- error_codeと- std::error_codeの相互運用性を大幅に改善した。- std::error_codeから- boost::system::error_codeを構築できるようになり、- std::error_code&をとる関数に- boost::system::error_codeを渡せるようになった
- error_conditionにストリーム入力演算子- operator<<を追加
Uuid
- GitHub #116 メモリ確保なくUUID文字列を書き込むためのto_chars()を追加
Build
- B2のバージョン4.6.1をリリース
- cygwin64でのb2エンジンのビルドを修正 (René Ferdinand Rivera Morell氏に感謝)
- compiler execからのclang toolsetのバージョン検出を修正 (Nikita Kniazev氏に感謝)
テスト済みコンパイラ
主要なテストコンパイラ:
- Linux:- Clang: 3.4, 3.5, 3.6, 3.7, 3.8, 3.9, 12.0.0
- Clang, C++11: 3.4, 11.0.0
- Clang, C++14: 3.5, 3.6, 3.7, 3.8, 3.9, 4.0, 5.0, 12.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
- Clang, C++20: 11.0.0, 12.0.0, 13.0.0
- GCC: 4.6.3, 11
- GCC, C++11: 4.7.3, 4.8.5, 11
- GCC, C++14: 5.4.0, 6.4.0, 7.3.0, 8.0.1, 9.1.0, 11
- GCC, C++17: 7.3.0, 8.0.1, 9.1.0, 11
- GCC, C++20: 8.0.1, 9.1.0, 10, 11
 
- OS X:- Apple Clang: 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
 
追加で含まれるテストコンパイラ: