本家リリースノート:
- 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
- Filsystem
- 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
は.dynsym
ELFセクションから情報を使用する- 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
追加で含まれるテストコンパイラ: