最終更新日時:
が更新

履歴 編集

Boost 1.75.0リリースノート

本家リリースノート:

リポジトリは以下:

リポジトリからのビルド方法は、egtraさんのブログを参照:

既知の問題

  • Boost.Operatorsは現在、C++20コンパイラと互換性がない。比較演算子が呼ばれると実行時に無限再帰か無限ループが起きる場合がある。この問題は、C++20で導入された演算子の書き換え動作が原因で発生する。回避策として、C++17以前の標準C++をターゲットにすることを推奨する。詳細はGitHub Utility #65を参照

新ライブラリ

  • JSON C++11でのJSONの解析、シリアライズ、DOMのライブラリ (作者Vinnie FalcoとKrystian Stasiowski)
    • C++11のみを要求する高速なコンパイル
    • アロケータサポートをともなう、かんたんで現代的なAPI
    • Boostを必要としないコンパイルのためのBOOST_JSON_STANDALONE定義
    • オプションとしてライブラリのリンクを必要としないヘッダオンリーモード
  • LEAF C++11での軽量なエラーハンドリングライブラリ (作者Emil Dotchevski)
    • 依存ライブラリがない、小さな単一ヘッダフォーマット
    • 最大効率で設計した ("happy"パスと"sad"パスがある)
    • ペイロードが重い場合でも、動的メモリ確保を行わない
    • 任意のエラー型をO(1)で転送する (コールスタックの深さに関係なく)
    • 例外処理の有無に関わらず使用できる
  • PFR ユーザー定義型に対するマクロやボイラープレートコードを必要としないリフレクションのライブラリ (作者Antony Polukhin)

更新ライブラリ

Asio

  • WindowsでUNIXドメインソケットのサポートを有効化。Windows 10以降、UNIXドメインソケット (別名ローカルソケット) はconnect_pair関数を除いて (operation_not_supportedエラーになる) サポートされる
  • ip::basic_resolverにexecutorから変換するコンストラクタと代入演算子を追加
  • polymorphic executorと (非推奨の) ハンドラ呼び出しフックに互換性を追加
  • 完了トークンアダプタexperimental::as_singleを追加。これを使用することによって、完了ハンドラの引数をひとつに結合できるようになる。単一パラメータをもつ完了シグニチャの場合、引数はそのまま渡される。2つ以上のパラメータの場合、引数はタプルに結合される。as_singleアダプタは、以下のようにuse_awaitableや構造化束縛と組み合わせて使用できる:

    auto [e, n] = co_await socket.async_read_some(
      boost::asio::buffer(data), as_single(use_awaitable));
    

    • また、以下のようにデフォルトの完了トークンとしても使用できる:

    using default_token = as_single_t<use_awaitable_t<>>;
    using tcp_socket = default_token::as_default_on_t<tcp::socket>;
    // ...
    awaitable<void> do_read(tcp_socket socket)
    {
      // ...
      auto [e, n] = co_await socket.async_read_some(boost::asio::buffer(data));
      // ...
    }
    

  • _POSIX_VERSIONを使用してサポート状況を検出することにより、MSG_NOSIGNALがより多くのプラットフォームで動作するようサポートを追加

  • Windowsでlibpthreadを使用してコンパイルする機能を追加
  • Intel C++ Compilerのワークアラウンドを追加
  • カスタムexecutorをもたないハンドラの検出と最適化をさらに追加
  • Windows環境でのタイマーキャンセル時のロック集中を減らした
  • パフォーマンスに測定可能な影響があったため、以前削除したヌルポインタチェックを復活させた
  • any_executorをRTTIのない環境でビルドできるようサポートを修正
  • thread_poolの単体テストがRTTIのない環境で動作するよう修正
  • WindowsのClangでのC++20コルーチンの互換性を修正
  • Windowsランタイムのいくつかの互換性問題を修正
  • asio::queryの追加によって起こったシャドウ名の警告を修正
  • Linuxでの「logical ‘or’ of equal expressions」警告を修正
  • switch文でのフォールスルー警告を修正
  • 不足していたpush/pop_options.hppのインクルードを追加
  • 「zero-as-null-pointer-constant (値ゼロをヌルポインタ定数として使用している)」警告を修正
  • カンマ演算子の警告を修正
  • selectリアクタがWindowsでどのようなときに使用されるのかを明確にするために、ドキュメントを更新
  • any_executorの比較と変換で曖昧さが発生する可能性があった問題を修正
  • MSVC 19.8での非実験的なC++20コルーチンの検出を追加
  • uClibcとの互換性を修正
  • 古いC++バージョンもしくは標準準拠度の低いC++コンパイラを対象にする場合の、Networking TS executorのstrand<>アダプトを修正

Atomic

  • 内部のロックプールで使用するアドレス探索アルゴリズムのSSE2とSSE4.1版を実装した。これにより、競合が激しいケースでの待機 (wait) と通知 (notify) の操作がパフォーマンス向上する可能性がある
  • GitHub #41 即値定数をともなうビット (論理) 操作で間違った命令列が生成されるためにAArch64ターゲットでコンパイルエラーになる可能性があった問題を修正

Beast

  • 修正
    • detect_ssl内での未使用パラメータの警告を抑制
    • Websocketのサンプルコードを、TLS接続でSNIを設定するよう更新
    • GitHub #2023 websocketasync_shutdownが、ベースとなるTLS転送をシャットダウンするよう修正
    • GitHub #2011 append_existingフラグをつけたファイルを開く操作が、POSIX環境で正しく動作するよう修正
    • GitHub #2039 Windowsのビルドで、Filesystemライブラリの要求に従ってbcryptライブラリをリンクするようにした
    • GitHub #2063 advanced_server_flexサンプルコードでのロジックエラーを修正
    • GitHub #1582 MSVCでの到達しないコードによるエラーを修正
    • GitHub #2070 body_limitが空のときのhttp bodyの振る舞いを修正
    • GitHub #2065 ゼロ幅書き込みが要求された際のbasic_streamの振る舞いを修正
    • GitHub #2080 Sec-* HTTPヘッダのenum表現を追加
    • GitHub #2085 fields::set()に対するnullptrの暗黙キャストを修正
    • GitHub #2029 basic_streamのC++20でのテストを修正
  • その他
    • Boost.Beast内でAsioのハンドラトラッキングを有効にするためのマクロBOOST_ASIO_ENABLE_HANDLER_TRACKINGを定義。詳細はasio handler trackingを参照
    • Bishop-Fox 2020セキュリティアセットを追加

Container

  • 新たなdevectorコンテナを追加。double-ended (両端) なvectorの実装であり、後方だけでなく前方にもcapacityがあり、先頭に償却定数時間で要素の挿入ができる
  • バグ修正
    • GitHub #152 ツリーベースのコンテナで、ムーブのみできる要素型のムーブ操作がコンパイルできない問題を修正
    • GitHub #156 vectorにもたせるアロケータとして16ビットのdifference_typeを設定するとコンパイルできない問題を修正
    • GitHub #157 不足していたインクルードを追加
    • GitHub #159 pmr::monotonic_buffer_resourceで一度に大きなメモリアロケートを行うとクラッシュする問題を修正
    • GitHub #160 uses_allocatorにはremove_cvref_tした型を渡す必要があった
    • GitHub #162 x86のMSVCでsmall_vectorを値渡しするとクラッシュする問題を修正
    • GitHUb #161 コンストラクタpolymorphic_allocator(memory_resource*)にヌルポインタを渡すとデフォルトのメモリリソースが使われる非標準の拡張を削除
    • GitHub #163 small_vectorcontainer_rebindできなかった問題を修正
    • GitHub #165 memory_resourceのインラインメンバが共有ライブラリでリンクエラーになる問題を修正
    • GitHub #166 ヘッダに記載されているcopyrightの文字エンコーディングを修正
    • GitHub #167 GCC 4.4で起きていた"error: the address of 'msg' will always evaluate as 'true' warning"という警告を修正
    • GitHub #169 clang11でdlmalloc_ext_2_8_6.cをビルドするとfloodで警告がでる問題を修正

endian

  • endian_arithmeticendian_bufferを継承しないようにした
  • BOOST_ENDIAN_NO_CTORSが定義された際、アライメントされていないendian_bufferendian_arithmeticはC++03のPODとなり、__attribute__((packed))が有効になる

Filesystem

  • GitHub #134 新機能 ファイルの生成日時を取得するcreation_time操作を追加
  • last_write_time(p, ec)操作が失敗した際の戻り値を、-1の代わりにstd::time_tが表現できる最小値に変更
  • hard_link_count(p, ec)操作が失敗した際の戻り値を、0の代わりにstatic_cast<uintmax_t>(-1)に変更
  • POSIXシステムで、file_sizeに指定したパスが非通常ファイル (non-regular file) に解決された場合、エラーコードとしてerrc::function_not_supportedを提示するようにした。これまではerrc::operation_not_permittedが報告されていた
  • Linuxにおいて、多くの操作内で可能な場合はstatxシステムコールを使用するようにした。これにより、ファイルシステムから照会される情報量を減らし、パフォーマンスを向上できる。statxシステムコールはLinux 4.11カーネルで導入された
  • GitHub #160 pathクラスの一部のメンバ関数の戻り値型から、const修飾を削除した。これまではこの問題により、呼び出し側でムーブ構築とムーブ代入が妨げられる可能性があった
  • OpenBSD 4.4以降で、ファイルシステムの容量 (space) を取得するためにstatvfsシステムコールを使用するようにした (GitHub #162によって考えついた)
  • GitHub #167 Windowsにおいて、space()が既存ファイルを識別できない場合に、エラーを返すようにした

Geometry

  • 警告 : 1.73.0で通知されたC++03の非推奨に続いて、1.75.0以降には優秀なC++14コンパイラが必要となる

GIL

  • 破壊的変更 次のリリースでGCC 5のサポートを終了する予定。サポートするC++の下限バージョンもC++11からC++14に変更する

Histogram

  • 修正
    • axis::variable{{0, 1, inf}}.value(1)がNaNではなく1を返すよう修正
    • axis::variableのコンストラクタは、ひとつの値がNaNである場合にstd::invalid_argument例外を送出するようにした
    • <boost/histogram/axis/traits.hpp>の前に<boost/type_traits.hpp>をインクルードした場合に発生するGCCのバグ (gcc-10.xのupstreamで修正される) に対するワークアラウンドを実装
    • 最新コンパイラバージョンでのいくつかの警告を修正
    • C++20標準でコンパイルした際に発生する警告を修正
  • ドキュメント
    • accumulator::meanaccumulator::weighted_meanの値 (value) と分散 (variance) を要求されたがaccumulatorにそれらを計算するための十分なエントリがない場合の、未定義動作をドキュメント化
    • axisのメタデータをなぜ等値比較でチェックするのかの論理的根拠の説明を追加

Interprocess

  • GitHub #127 1.74.0のbasic_managed_shared_memoryが静的アサーションで失敗する問題を修正

Intrusive

  • バグ修正
    • GitHub #48 MSVCでの条件分岐付きの代入の警告を修正
    • GitHub #49 空の制御文による警告を修正
    • GitHub #52 BOOST_INTRUSIVE_BSR_INTRINSICでの不正なキャストを修正

Log

  • バグ修正
    • GitHub #125 ログファイルのローテーションでの、(set_target_file_name_pattern()メンバ関数で設定したパターンに基づく) ターゲットファイル名を生成する際のtext_file_backendバックエンドで使用されるカウンターを修正
    • GitHub #128 volatilebasic_sink_frontendのバージョンカウンタをatomicに置き換え
    • GitHub #131 asynchronous_sinkフロントエンドで、フロントエンドによるrunの呼び出しが内部の専用スレッドではなくユーザースレッドから行われた場合に発生する可能性のあった、flushrunの間での競合を解決
  • 詳細はChangelogを参照

Move

  • バグ修正
    • GitHub #30 未使用変数の警告を抑制するために、voidへのキャストは汎用的な方法ではなかった

Mp11

  • mp_pairwise_foldを追加 (Barry Revzin氏による推奨)
  • 破壊的変更 mp_invokeを削除。代わりにmp_invoke_qを使用すること

Optional

  • boost::noneconstexpr宣言
  • GitHub #78 C++20でoptional<std::filesystem::path>が壊れていた問題を修正

Outcome

  • アナウンス
    • 来年、Boostの3リリース後がv2.1ブランチの最終リリースとなる。Boost 1.76以降、v2.2ブランチがデフォルトになる。このブランチでは、v2.1に対するいくつかの大きな破壊的変更がある。詳細はドキュメントを参照
  • 強化
    • ADL検出のイベントフックを、ポリシー指定のイベントフックに置き換えた。これは脆弱性 (だれかがなにか変更した際に、フックが静かに自己無効化する)、コンパイラのバグ (コンパイラ設定の違いによるフックの間違いや、一部のフックだけが検出されるなど)、およびエンドユーザーが使用することがむずかしいなどが理由。ポリシー指定のイベントフックは、下位互換性のためにデフォルトでADL検出フックにできる。そのためには、OUTCOME_ENABLE_LEGACY_SUPPORT_FORマクロの値を2020未満に設定する
    • OUTCOME_GCC6_CONCEPT_BOOL設定を改善。古いGCCはboolベースのコンセプト構文をもっていたが、新しいGCCは標準に準拠する。しかし、レガシー構文と準拠構文がどのようなときに使用できるのか十分に理解できていなかったために、GCCに指定するオプションによってコンパイルに失敗していた。新しいロジックでは、GCC 8以前は常にレガシー構文を使用する。それ以外の場合、GCCがC++20モード以降である場合に限り、準拠構文を使用する。これにより、GCCでのコーナーケースのビルド失敗が解決されることを期待している
  • バグ修正
    • Boost.Outcomeは現在、BOOST_NO_EXCEPTIONSが定義された状態でもコンパイルに成功するはずである。Boost.ExceptionのメンテナであるEmilのおかげで、グローバルにC++に例外が無効にされてもコンパイルできるようになった。ただしその場合、boost::exception_ptrを使用することはできない
    • GitHub #236 コルーチンのサポートでは、C++20標準で要求されているにも関わらず、final_suspend()noexceptではなかった。これは修正されたが、コンパイラがnoop_coroutineを実装している場合に限る。さらに、noop_coroutineが使用可能な場合は、はるかに効率的なコルーチンハンドルを使用してawait_suspend()の変種を返す。これによりコード生成とコンテキストスイッチのパフォーマンスが大幅に向上する

Polygon

  • C++20対応のために、event_comparison_type, vertex_equality_predicate_type, voronoi_predicatesを修正 (Glen Fernandes氏)

Preprocessor

  • __VA_OPT__をもつC++20モードでの可変引数データで、可変引数サイズが正しく0になるようサポート
    • これは、このC++20モードでは空の配列、空のリスト、空の可変引数の間での変換が有効になったことも意味する
    • エンドユーザーは、このライブラリでの空の可変引数データの詳細について、「variadic macros (可変引数マクロ)」トピックの「C++20 Support For Variadic Macros (可変引数マクロのC++20サポート)」パートで読むことができる
  • 現在使用しているプリプロセッサが標準C++に準拠しているかプリプロセッサかを識別するためのマクロBOOST_PP_IS_STANDARD()を追加。このライブラリは広く正しく動作するが、最新のデフォルトVC++プリプロセッサを含むさまざまなワークアラウンドが必要になるプリプロセッサは、標準準拠のプリプロセッサとは見なされない。しかし、GCC、Clang、およびVS2019の新しいデフォルトではないプリプロセッサを含むほとんどのプリプロセッサは標準準拠のプリプロセッサである
  • 標準C++準拠のプリプロセッサにおいて、config/limits.hppで定義されるいくつかの制限を、翻訳単位 (TU, Translation Unit) でより高い値に変更できるようにした。エンドユーザーは「limitations (制限)」トピックを読んで、どの制限を変更できるかを理解する必要がある
  • 標準C++準拠のプリプロセッサにおいて、FORWHILEのイテレーション数の最大値を指定することを許可するために、rdからはじまるユーザー定義マクロのイテレーション数は、以前のリリースでそうしたように2ではなく1からはじまる。ユーザー定義マクロ内でそのようなイテレーション数が使用されている場合に破壊的変更が起こる可能性があるが (おそらくそうはならない)、最大数で数値・論理演算をする際に、ユーザー定義マクロで最大数を指定できるようにするために、いくつかの不可解なバグを修正する必要があった。標準C++準拠ではないプリプロセッサにおいて、それらには通常、最大数でのループ実行を許可しない制限があり、脆弱なプリプロセッサに破壊的変更は加えないほうがいいと考えたため、この変更は行わなかった。また、いくつかの難解なバグを修正し、ユーザー定義マクロの呼び出しによる最大数を提供する。rd開始のマクロのイテレーション数が実際には何であるかについてドキュメント化されていないため、この変更を行うことができると考えた。これはイテレーション数がインクリメントされるだけだ
  • あらゆるコンパイラで可変引数マクロが動作することを想定するよう更新した。表面上では、これがC++11以上を要求するようになったように思えるだろうが、GCC、Clang、VC++を含むほとんどの主要コンパイラは、C++98 / C++03に厳密には準拠しないが、C++98 / C++03モードでの可変引数マクロもサポートする

Rational

  • 新たなC++20のoperator==書き換えルールで壊れないよう、関係演算子を修正

Signals2

  • C++20標準モードでのコンパイルを修正するために、C++アロケータモデルのサポートを正しくした (Glen Fernandes氏とConrad Poelman氏)

System

  • プラットフォーム固有のヘッダwindows_error.hpp, linux_error.hpp, cygwin_error.hppを非推奨化。将来のリリースで削除する予定
  • generic_category()system_category()の古い名前 (get_generic_category(), get_posix_category(), posix_category(), errno_ecat(), get_system_category(), native_ecat()) を非推奨化。将来のリリースで削除する予定
  • error_condition::failedを非推奨化。将来のリリースで削除する予定
    • error_conditionoperator bool()を以前のvalue() != 0の意味に戻した。次のリリースでは<system_error>標準ヘッダとの相互運用性がさらに向上する予定なので、この変更はstd::error_conditionとの互換性のために行われる。ただしこの変更はerror_code::failedには影響せず、それはいまだ健在である
  • 同じ理由で、バッファをとるバージョンのerror_condition::message()のオーバーロードを非推奨化。error_code::message()には影響しない

uBLAS

  • C++20標準モードでのコンパイルを修正するために、C++アロケータモデルのサポートを正しくした (Glen Fernandes氏とConrad Poelman氏)

VMD

  • VMDでの数値の構文解析が更新され、エンドユーザーがプリプロセッサライブラリの数値の制限 (最大値) を変更できるようにした。BOOST_PP_LIMIT_MAGによって最大値を指定できる
  • BOOST_VMD_IS_GENERAL_IDENTIFIERマクロが追加され、識別子 (identifier) を固有識別子 (specific identifier) として登録しなくても、VMD識別子構文にマッチするプリプロセッサトークンを表す入力の構文解析のサポートを追加

Wave

  • 宇宙船演算子<=>を含むC++20トークンを追加
  • バグ修正
    • GitHub #94 再スキャン時の__LINE____FILE__の間違った振る舞いを修正

テスト済みコンパイラ

主要なテストコンパイラ:

  • Linux:
    • Clang: 3.0, 4.0.1, 6.0.1
    • Clang, C++0x: 3.0
    • Clang, C++11: 3.0, 3.1, 3.2, 3.3, 3.4, 4.0.1, 6.0.1, 7.0.0, 8.0.0, 9.0.0, 10.0.0, 11.0.0
    • Clang, C++14: 3.5.0, 3.6.0, 3.7.1, 3.8.0, 3.9.1, 4.0.0, 4.0.1, 5.0.2, 6.0.1, 7.0.0, 8.0.0, 9.0.0, 10.0.0, 11.0.0
    • Clang, C++17: 5.0.2, 6.0.1, 7.0.0, 8.0.0, 9.0.0, 10.0.0, 11.0.0
    • GCC: 4.4.7, 4.5.3, 4.6.3, 5.4.0, 8.0.1
    • GCC, C++0x: 4.4.7
    • GCC, C++11: 4.7.3, 4.8.5, 4.9.4, 5.4.0, 6.4.0, 7.1.0, 8.0.1
    • GCC, C++14: 5.4.0, 5.5.0, 6.4.0, 7.1.0, 7.3.0, 8.0.1
    • GCC, C++17: 7.3.0, 8.0.1
    • Intel, C++14: 18.0
  • OS X:
    • Apple Clang: 9.0.0, 9.1.0, 10.0.0, 11.0.0
    • Apple Clang, C++11: 9.0.0, 9.1.0, 10.0.0, 11.0.0
    • Apple Clang, C++14: 9.0.0, 9.1.0, 10.0.0, 11.0.0
    • Apple Clang, C++17: 9.1.0, 10.0.0, 11.0.0
    • Apple Clang, C++1z: 9.0.0
    • Apple Clang, C++2a: 10.0.0, 11.0.0
  • Windows:
    • GCC: 3.4.5, 4.1.2, 4.2.4, 4.3.3, 4.4.0, 4.5.4
    • GCC, C++0x: 4.6.4
    • GCC, C++11: 4.7.3, 4.8.1, 4.9.3
    • GCC, C++14: 5.1.0, 5.2.0, 5.3.0, 6.1.0, 6.2.0, 6.3.0, 6.4.0
    • GCC, C++17: 7.1.0, 7.2.0, 7.3.0
    • Visual C++: 7.1, 8.0, 9.0, 10.0, 11.0, 12.0, 14.0, 14.1
  • FreeBSD:
    • Clang: 4.0.0
    • Clang, C++11: 4.0.0
    • Clang, C++14: 4.0.0
    • Clang, C++1z: 4.0.0

追加で含まれるテストコンパイラ:

  • Linux:
    • Clang: 3.0, 3.8.1, 3.9.1, 4.0.1, 5.0.2, 6.0.1
    • Clang, C++0x: 3.0
    • Clang, C++11: 3.0, 3.1, 3.2, 3.3, 3.4, 4.0.1, 6.0.1, 7.0.0, 8.0.0
    • Clang, C++14: 3.5.0, 3.6.0, 3.7.1, 3.8.0, 3.9.1, 4.0.0, 4.0.1, 5.0.2, 6.0.1, 7.0.0, 8.0.0
    • Clang, C++17: 5.0.2, 6.0.1, 7.0.0, 8.0.0
    • GCC: 4.4.7, 4.5.3, 4.6.3, 4.9.4, 5.4.0, 5.5.0, 8.0.1
    • GCC, C++0x: 4.4.7
    • GCC, C++11: 4.7.3, 4.8.5, 4.9.4, 5.4.0, 6.4.0, 7.1.0, 8.0.1
    • GCC, C++14: 5.4.0, 5.5.0, 6.3.0, 6.4.0, 7.1.0, 7.3.0, 8.0.1, 8.1.0
    • GCC, C++17: 7.3.0, 8.0.1
    • Intel, C++14: 18.0
  • OS X:
    • Apple Clang: 9.0.0, 9.1.0, 10.0.0
    • Apple Clang, C++11: 9.0.0, 9.1.0, 10.0.0
    • Apple Clang, C++14: 9.0.0, 9.1.0, 10.0.0
    • Apple Clang, C++17: 9.1.0, 10.0.0
    • Apple Clang, C++1z: 9.0.0
    • Apple Clang, C++2a: 10.0.0
  • Windows:
    • GCC: 3.4.5, 4.1.2, 4.2.4, 4.3.3, 4.4.0, 4.5.4
    • GCC, C++0x: 4.6.4
    • GCC, C++11: 4.7.3, 4.8.1, 4.9.3
    • GCC, C++14: 5.1.0, 5.2.0, 5.3.0, 6.1.0, 6.2.0, 6.3.0, 6.4.0
    • GCC, C++17: 7.1.0, 7.2.0, 7.3.0
    • Visual C++: 7.1, 8.0, 9.0, 10.0, 11.0, 12.0, 14.0, 14.1
  • FreeBSD:
    • Clang: 4.0.0
    • Clang, C++11: 4.0.0
    • Clang, C++14: 4.0.0
    • Clang, C++1z: 4.0.0

翻訳

Akira Takahashi