🐱
Boost Version 1.77.0のリリースノート(趣味の和訳)
はじめに
自分用に趣味で作ったBoost Version 1.77.0 Release Notesの和訳です。ライセンスは原文のBoost Software License, Version 1.0に従います。操作性などのため、項目の種類を一部変更しています。誤訳などあればご指摘いただけると嬉しいです。
新しいライブラリ
Describe
- Peter DimovによるC++14用リフレクションライブラリです。列挙型・構造体・クラスのメンバーを説明するためのマクロとその情報を問い合わせるプリミティブを提供します。
Lambda2
- Peter Dimovによる依存関係のないC++14用シングルヘッダーのラムダ式ライブラリです。
_1 + 5
、_1 % 2 == 0
、_1 > _2
、_1 == ' ' || _1 == '\t'
のような式から単純な関数オブジェクトの作成を可能にします。
更新されたライブラリ
Any
-
boost::anys::basic_any
を追加しました。カスタマイズ可能なSmall Object Optimizationを持つデータ型で、インスタンスはValueTypeの要件を満たす任意の型のインスタンスを保持できます(Ruslan Arutyunyan @rarutyunに感謝します)。本当に必要か分からない場合はboost::any
を使ってください。 - 追加テストにGithubActions CIを使いはじめました。
Asio
- 個別非同期操作のキャンセルに対応しました。
-
associator
トレイトを追加しました。一般にフォワードアソシエイターに使われます。 - Asioに実装されたすべての非同期操作が変更され、完了ハンドラ(completion handlers)が右辺値参照として呼び出されるようになりました。
- 複数完了シグネチャの非同期操作に対応しました。
-
awaitable<>
に&&
演算子、||
演算子を追加しました。コルーチンを並行してトリビアルにawaitできます。 -
experimental::as_tuple
完了トークンアダプターを追加しました。 -
experimental::append
完了トークンアダプターを追加しました。 -
experimental::prepend
完了トークンアダプターを追加しました。 -
experimental::deferred
完了トークンを追加しました。非同期操作の遅延実行を可能にします。 -
experimental::parallel_group
クラスとexperimental::make_parallel_group
関数を追加しました。 -
experimental::promise
を追加しました。非同期操作の即時実行と同期を可能にします。 -
experimental::coro
クラステンプレートを追加しました。C++20コルーチンプリミティブであり、非同期待機(co_await
)とyield処理(co_yield
)を組み合わせる機能を持ちます。 -
ssl::stream<>
にムーブ代入を追加しました。 -
co_spawn
を実行者にコルーチンの初期化段階をdispatch
するように変更しました。 -
any_executor
とany_io_executor
が非同期操作として用いられたときの追加最適化を有効にしました。 -
awaitable<>
にnodiscard
属性を追加しました。 - 既定のリサイクリングアロケーターのキャッシュ済みスロットを増やしました。
- 既定アロケーターの動作をアライメント要件を尊重するように変更しました。オーバーアライン型(over-aligned types)をサポートするためです。
- 逆引きにおいて結果文字列の初期化を保証しました。
-
use_awaitable_t::executor_with_default
の再帰的テンプレートインスタンス化問題を解決しました。 -
any_io_executor
等価演算子を対象実行者に基づいて正しい結果を返すように修復しました。 -
strand<>
が潜在的なムーブ元の実行者を使わないように修正しました。 - コンパイラの機能性を検出したとき、
clang
にgcc
テストを使わないようにしました。 - MSVCに同梱された
clang
におけるコルーチンサポートを無効化しました。 -
OPENSSL_NO_SSL_INTERN
実装時の最新版LibreSSL互換性を修正しました。 -
posix::basic_stream_descriptor
ムーブ演算子を非既定実行者でも動作するように修正しました。 - さらなる詳細はRevision Historyを参照してください。
Atomic
-
アトミック参照オブジェクトを構築する
make_atomic_ref
とmake_ipc_atomic_ref
ファクトリ関数を追加しました。 -
atomic_ref
とipc_atomic_ref
にC++17テンプレート引数推論補助を追加しました。コンストラクタ引数から推論できる場合、テンプレート引数を省略できます。
Beast
- マイナーバグ修正と更新CIレポーティングのメンテナンスアップデートです。
- どんな個人・会社がBeastを使っているか知りたいと考えています。Beastを使っている法人・個人(Companies and Individuals Using Beast)へのエントリ追加を検討してください。
- 変更の完全なリストはRelease Notesを参照してください。
Conversion
Core
-
boost/core/uncaught_exceptions.hpp
がMac OS 10.4以降と互換性を持つように変更されました(PR#92)。
DLL
-
boost::dll::library_info
で不正な形式のELSに対する実行時チェックを追加しました。 -
boost::dll::library_info
は、.symtab
が空または存在しない場合、.dynsym
ELFセクションの情報を使用します。 -
boost::dll::library_info
において保護されたELFシンボルをインポート可能としてリストします(#50)。 - POSIX環境で
wchar_t
からcharへの不要な変更を削除しました。Vladislav Shchapovに感謝します(PR#49)。 - 追加テストにGithubActions CIを使いはじめました。
Filesystem
-
Boost.FileSystem v4が導入されました。この新しいバージョンではv3のすべての非推奨(deprecated)機能が削除され、またBoost.FilesystemをC++17で導入されたstd::filesystemとより互換させるために多数のAPIが破壊的に変更されました。v3とv4の差異はこのリリースノートおよびドキュメンテーションでv3およびv4タグを用いて記載され、セクションを分離して要約されます。ユーザーはコンパイル時に
BOOST_FILESYSTEM_VERSION
マクロを3または4として実装することでBoost.Filesystemのバージョンを選択できます。それぞれのライブラリバージョンに対するBoost.Filesystemの分離コンパイルは不要です。ひとつのバイナリがv3とv4をサポートします。ユーザーは同一アプリケーションでv3とv4を併用しないでください。微妙なバグを導くかもしれません。現在はv3が既定です。将来的にはv4が既定となり、v3は削除されるでしょう。v4は機能的ですがまだ作業中で、将来的にAPIが破壊的に変更される可能性があります。 -
v4:
path::filename
、path::stem
、path::extension
は、パスがそれらの成分のみから構成される場合、パスのルート名やルートディレクトリをファイル名として認識しなくなりました。例えばWindowsで、これまでpath("C:").filename()
は"C"、path("C:\\").filename()
は""を返しましたが、今後はどちらも空のパスを返します(#88、#194)。 -
v4:
path::stem
、path::extension
はドットではじまり他のドットを持たないファイル名を拡張子として扱いません。ドットではじまるファイル名は普通からの拡張子を持つファイル名として扱われます。ほとんどのUNIXライクなシステムでは先頭のドットは隠しファイルを示すために使われます(#88)。 -
New:Windowsにおける多様なパスプレフィックスのサポートを改善しました。ローカルデバイスプレフィックス("\.")のサポートとNTパスプレフィックス("\??")の実験的サポートを追加しました。これらのプレフィックスはパスのルート名に含められます。これらのプレフィックスをBoost.Filesystem v3で使うと予想外の結果(例:
path("\\\\.\\").stem() == "\\\\"
)を導くことに注意してください。Boost.Filesystem v4でのみ使うことが推奨されます。 - 標準化パスにおいていくつかの場合の重複したドット(".")要素を除去するように
path::lexically_normal
の実装を修正しました。 -
New:Linuxにおける
statx
とgetrandom
システムコールの実行時検出を追加しました。これはコンパイル時にシステムコールが存在したのに実行時にENOSYS
で失敗した場合に有用です(例えばDockerコンテナはホストでは許可されているのにsyscallを制限した場合)(#172)。 - New:ライブラリビルド時における多様なシステムAPI使用の無効化のサポートを追加しました。あるAPIがライブラリ構成スクリプト(configuration script)により存在が検出されたのに何らかの理由で使用すべきではないとき(例えば対象システムにおいて実行時検出が機能しない場合)に有用です。より詳細な情報を得るにはライブラリドキュメンテーションの設定マクロ(configuration macro)の記述を参照してください。
-
New:
copy_file
操作にcopy_options::synchronize_data
とcopy_options::synchronize
オプションを追加しました。これらはパーマネントストレージに書き込んだデータと属性の同期を可能にします。パフォーマンスの観点からは高コストですが、コピーされたデータの信頼性を確保可能にします。Boost.Filesystem 1.74.0以降のcopy_file
はPOSIXシステムにおいて暗黙にデータ同期することに注意してください。このリリースではより多くのプラットフォームがサポートされ、呼び出し側が明示的に要求した場合を除いて既定のデータ同期が無効化されました(#186)。 - POSIXシステムにおいて内部で発行されたいくつかのシステムコールに対して
EINTR
エラーコード処理が追加されました。特にEINTR
はclose
で無視された可能性があり、HP-UXにおいてファイル記述子のリークを引き起こしていたかもしれません。 - Linuxの
sendfile
とcopy_file_range
システムコールに基づくcopy_file
の実装において、特定のファイルシステムがシステムコールと一般のread/write
ループへのフォールバックに対応していないこを示すエラーコードの処理を追加しました。eCryptFS
やその他の潜在的なファイルシステムにおけるcopy_file
の失敗が修正されるでしょう(#184)。 -
copy_file_range
システムコールはLinux kernel 4.5から使われていましたが、以前は5.3以降でのみ有効でした。copy_file
の実装は、copy_file_range
がファイルシステムを跨ぐファイルのコピーに失敗した場合、sendfile
またはread/write
ループにフォールバックします。 - Linuxの
sendfile
とcopy_file_range
システムコールに基づくcopy_file
の実装は生成コンテンツを持つファイルを含むと知られているファイルシステムでは使われなくなりました。これらのシステムコールはそのようなファイルと非互換であり、コピーによりサイズ0のファイルが作成されます。代わりに一般のread/write
ループが使われます。現在、ブラックリストに載っているファイルシステムはprocfs、sysfs、tracefs、debugfsです。 -
read/write
ループに基づくcopy_file
の実装において、パフォーマンスをより最適化するために一時記憶装置で使われるバッファーの最大サイズが増加され、対象ファイルシステムのブロックサイズが考慮されるようになりました。 - Windows CEにおいて、プロセスのカレントパスを得るための
current_path
の呼び出しが、成功してルートパスを返す代わりにエラーを伴って失敗します。このプラットフォームはカレントディレクトリをサポートしていません。以前のBoost.Filesystemリリースがと同様にカレントパスの変更は失敗します。 -
canonical
について、以前のシンボリックリンクが元のパスと異なるルートの絶対パスで解決された場合、ルートより上のディレクトリを参照するシンボリックリンクのチェックを修正しました。 -
canonical
について、呼び出しの間に解決できるシンボリックリンクの最大数を制限しました。現在、この制限は少なくとも40シンボリックリンクです。 - Windowsにおいて、
canonical
とweakly_canonical
は結果のパスのルートディレクトリセパレーターにpath::preferred_separator
を使うようになりました。これはWindows APIがUNCパスやWin32ファイルシステムプレフィックス("\?")で始まるパスの一般セパレーターを処理できないことによる「file not found」エラーを修正します(#87、#187)。 -
New:
base
パスを引数に受け取るweakly_canonical
のオーバーロードを追加しました。 - Windowsにおいて、
weakly_canonical
が入力されたパスはファイルシステムに存在しないが後続するドット―ドット要素("..")にキャンセルされた場合にエラーで失敗しなくなりました。例えばweakly_canonical("C:\\a\\..")
は"C:\a"ディレクトリが存在しなければ以前は失敗していました(#201)。 - Windowsにおける
read_symlink
について、リパースポイントの処理を修正しました。この処理はいくつかのマウントポイント(例えば、 Boxクラウドストレージドライバーの作成したもの)、プリント名が空のディレクトリジャンクションポイントに対して空のパスを返すようになりました。この実装ではリパースポイントの代替名を解析して、Win32パスの再構築を試みます(#187)。 - Windowsにおいて、libc++バージョン7.0以降で標準ライブラリがワイド文字によるファイルオープン対応の場合、
boost/filesystem/fstream.hpp
の提供するファイルストリームはワイド文字パスを使うようになりました(#181)。 - Windowsにおいて、Windowsが開発者モードに設定されていればシンボリックリンクの作成時に昇格された特権が不要となりました。
- いくつかのコンパイラでBoost.Filesystemの内部グローバルオブジェクトはユーザーのグローバルデストラクタ呼び出し後に破壊されるようになりました。これによりプログラムの終了段階でもBoost.Filesystemのメソッドを呼び出せます。 特にパスのロケールが文字コード変換で使われる場合や
path::imbue
の呼び出してインストールされる場合に重要です。対応するコンパイラにはMSVC、GCC、Clang、#pragma section
または__attribute__ ((init_priority))
によりプログラムの初期化順を指定できるコンパイラ(MSVCまたはGCC互換コンパイラ)が含まれます。
JSON
-
value_to
がTupleLike
型に対応しました。 -
value_to
とvalue_from
がstd::array
や類似の型に対応しました。 - 内部の
string
からstd::string_view
への暗黙の変換演算子を追加しました。 -
std::hash
のjson型への特殊化を追加しました。 -
object
とkey_value_pair
のアロケーションエラーを修正しました。 - 空レンジのイテレーターペアから
array
を作成する際のクラッシュを修正しました。
LexicalCast
-
int
で表現できない範囲の浮動小数点値のint
への割り当てを修正しました。 - 追加テストにGithubActions CIを使いはじめました。
Log
- riscv32ターゲットのコンパイルを修正しました(PR#150)。
Mp11
-
mp_intersperse
、mp_split
、mp_join
を追加しました。
Multi-index Containers
- メンテナンスしました。
PFR
-
boost::pfr::hash_value()
のコリジョンカウント削減と品質改善のためにMurMurハッシュに基づいたhash_combine()の実装を使用しました。 - C++14モードのVisual Studio 2017をサポートしました(Denis Mikhailov @denzor200に感謝します)。
- インスペクションツールで発見された問題を修正しました。
- いくつかの警告、例えばinclude/boost/pfr/detail/fields_count.hppの余分なセミコロン除去などを修正しました(#72)。
- 継承された型に対するコンパイル時アサートを追加しました(Denis Mikhailov @denzor200に感謝します)。
- コピー省略の保証が有効な場合、非moveableフィールドのアグリゲーションがリフレクション可能になりました。
- スペルを修正しました。
- 追加テストにGithubActions CIを使いはじめました。
PropertyTree
- メンテナンスリリースです。
- CLにおけるコンパイラカバレッジを拡張しました。
- CMakeLists.txtに対するBoost互換性を修正しました。
System
-
error_category
からstd::error_category
への変換演算子が修正されて<map>
と<mutex>
が不要になりました。 -
error_category
の比較演算子がメンバー関数からインラインフレンド関数に変更されました(上述の変更の副次的影響です)。 -
error_condition
はオブジェクトの実体化を避けるために必要となるまでgeneric_category()
の呼び出しを遅延するようになりました。 -
error_condition::failed
とerror_condition::message
がdeprecatedではなくなり、operator bool()
がfailed()
を返すように戻されました。 - オブジェクトのインスタンス化を避けるため、システムカテゴリは
generic_category()
を呼び出さなくなりました。 - いくつかの場面で
default_error_condition
の戻り値がシステムカテゴリから一般カテゴリのerror_condition
に変更されました。POSIXで入力されたerror_code
がシステムカテゴリであり対応する任意のerrc_t
値が存在しない場合に発生します。 -
error_code
とstd::error_code
の相互運用性が大幅に改善されました。std::error_code
からboost::system::error_code
を構築でき、std::error_code&
を受け取る関数にboost::system::error_code
を渡せます。 -
error_condition
に対するストリーム挿入演算子が追加されました。
Uuid
- アロケーションせずにuuid文字列を書き込むための
to_chars
を追加しました(PR#116)。
更新されたツール
Build
- B2 version 4.6.1のリリースを含みます。
テスト済みのコンパイラ
Boostの主要なテストコンパイラは以下です。
- 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
謝辞
Marshall Clow、Michael Caisse、Glen Fernandesがこのリリースをマネージしました。
Discussion