本家リリースノート:
- 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
追加で含まれるテストコンパイラ: