🐱

Boost Version 1.77.0のリリースノート(趣味の和訳)

2021/12/09に公開

はじめに

自分用に趣味で作った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_executorany_io_executorが非同期操作として用いられたときの追加最適化を有効にしました。
  • awaitable<>nodiscard属性を追加しました。
  • 既定のリサイクリングアロケーターのキャッシュ済みスロットを増やしました。
  • 既定アロケーターの動作をアライメント要件を尊重するように変更しました。オーバーアライン型(over-aligned types)をサポートするためです。
  • 逆引きにおいて結果文字列の初期化を保証しました。
  • use_awaitable_t::executor_with_defaultの再帰的テンプレートインスタンス化問題を解決しました。
  • any_io_executor等価演算子を対象実行者に基づいて正しい結果を返すように修復しました。
  • strand<>が潜在的なムーブ元の実行者を使わないように修正しました。
  • コンパイラの機能性を検出したとき、clanggccテストを使わないようにしました。
  • MSVCに同梱されたclangにおけるコルーチンサポートを無効化しました。
  • OPENSSL_NO_SSL_INTERN実装時の最新版LibreSSL互換性を修正しました。
  • posix::basic_stream_descriptorムーブ演算子を非既定実行者でも動作するように修正しました。
  • さらなる詳細はRevision Historyを参照してください。

Atomic

  • アトミック参照オブジェクトを構築するmake_atomic_refmake_ipc_atomic_refファクトリ関数を追加しました。

  • atomic_refipc_atomic_refにC++17テンプレート引数推論補助を追加しました。コンストラクタ引数から推論できる場合、テンプレート引数を省略できます。

Beast

Conversion

  • boost::implicit_castconstexprになりました(#25)。
  • 無効なリンクを修正しました(PR#23)。
  • 追加テストにGithubActions CIを使いはじめました。

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が破壊的に変更される可能性があります。
  • v4path::filenamepath::stempath::extensionは、パスがそれらの成分のみから構成される場合、パスのルート名やルートディレクトリをファイル名として認識しなくなりました。例えばWindowsで、これまでpath("C:").filename()は"C"、path("C:\\").filename()は""を返しましたが、今後はどちらも空のパスを返します(#88#194)。
  • v4path::stempath::extensionはドットではじまり他のドットを持たないファイル名を拡張子として扱いません。ドットではじまるファイル名は普通からの拡張子を持つファイル名として扱われます。ほとんどのUNIXライクなシステムでは先頭のドットは隠しファイルを示すために使われます(#88)。
  • New:Windowsにおける多様なパスプレフィックスのサポートを改善しました。ローカルデバイスプレフィックス("\.")のサポートとNTパスプレフィックス("\??")の実験的サポートを追加しました。これらのプレフィックスはパスのルート名に含められます。これらのプレフィックスをBoost.Filesystem v3で使うと予想外の結果(例:path("\\\\.\\").stem() == "\\\\")を導くことに注意してください。Boost.Filesystem v4でのみ使うことが推奨されます。
  • 標準化パスにおいていくつかの場合の重複したドット(".")要素を除去するようにpath::lexically_normalの実装を修正しました。
  • New:Linuxにおけるstatxgetrandomシステムコールの実行時検出を追加しました。これはコンパイル時にシステムコールが存在したのに実行時にENOSYSで失敗した場合に有用です(例えばDockerコンテナはホストでは許可されているのにsyscallを制限した場合)(#172)。
  • New:ライブラリビルド時における多様なシステムAPI使用の無効化のサポートを追加しました。あるAPIがライブラリ構成スクリプト(configuration script)により存在が検出されたのに何らかの理由で使用すべきではないとき(例えば対象システムにおいて実行時検出が機能しない場合)に有用です。より詳細な情報を得るにはライブラリドキュメンテーションの設定マクロ(configuration macro)の記述を参照してください。
  • Newcopy_file操作にcopy_options::synchronize_datacopy_options::synchronizeオプションを追加しました。これらはパーマネントストレージに書き込んだデータと属性の同期を可能にします。パフォーマンスの観点からは高コストですが、コピーされたデータの信頼性を確保可能にします。Boost.Filesystem 1.74.0以降のcopy_fileはPOSIXシステムにおいて暗黙にデータ同期することに注意してください。このリリースではより多くのプラットフォームがサポートされ、呼び出し側が明示的に要求した場合を除いて既定のデータ同期が無効化されました(#186)。
  • POSIXシステムにおいて内部で発行されたいくつかのシステムコールに対してEINTRエラーコード処理が追加されました。特にEINTRcloseで無視された可能性があり、HP-UXにおいてファイル記述子のリークを引き起こしていたかもしれません。
  • Linuxのsendfilecopy_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のsendfilecopy_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において、canonicalweakly_canonicalは結果のパスのルートディレクトリセパレーターにpath::preferred_separatorを使うようになりました。これはWindows APIがUNCパスやWin32ファイルシステムプレフィックス("\?")で始まるパスの一般セパレーターを処理できないことによる「file not found」エラーを修正します(#87#187)。
  • Newbaseパスを引数に受け取る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_toTupleLike型に対応しました。
  • value_tovalue_fromstd::arrayや類似の型に対応しました。
  • 内部のstringからstd::string_viewへの暗黙の変換演算子を追加しました。
  • std::hashのjson型への特殊化を追加しました。
  • objectkey_value_pairのアロケーションエラーを修正しました。
  • 空レンジのイテレーターペアからarrayを作成する際のクラッシュを修正しました。

LexicalCast

  • intで表現できない範囲の浮動小数点値のintへの割り当てを修正しました。
  • 追加テストにGithubActions CIを使いはじめました。

Log

  • riscv32ターゲットのコンパイルを修正しました(PR#150)。

Mp11

  • mp_interspersemp_splitmp_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::failederror_condition::messageがdeprecatedではなくなり、operator bool()failed()を返すように戻されました。
  • オブジェクトのインスタンス化を避けるため、システムカテゴリはgeneric_category()を呼び出さなくなりました。
  • いくつかの場面でdefault_error_conditionの戻り値がシステムカテゴリから一般カテゴリのerror_conditionに変更されました。POSIXで入力されたerror_codeがシステムカテゴリであり対応する任意のerrc_t値が存在しない場合に発生します。
  • error_codestd::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

テスト済みのコンパイラ

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