本家リリースノート:
- https://github.com/boostorg/website/blob/master/feed/history/boost_1_75_0.qbk
- http://www.boost.org/users/history/version_1_75_0.html
リポジトリは以下:
リポジトリからのビルド方法は、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
- Atomic
- Beast
- Container
- Endian
- Filesystem
- Geometry
- GIL
- Histogram
- Interprocess
- Intrusive
- Log
- Move
- Mp11
- Optional
- Outcome
- Polygon
- Preprocessor
- Rational
- Signals2
- System
- uBLAS
- VMD
- Wave
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
websocket
のasync_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セキュリティアセットを追加
- Boost.Beast内でAsioのハンドラトラッキングを有効にするためのマクロ
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_vector
をcontainer_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_arithmetic
がendian_buffer
を継承しないようにしたBOOST_ENDIAN_NO_CTORS
が定義された際、アライメントされていないendian_buffer
とendian_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::mean
とaccumulator::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
volatile
のbasic_sink_frontend
のバージョンカウンタをatomic
に置き換え - GitHub #131
asynchronous_sink
フロントエンドで、フロントエンドによるrun
の呼び出しが内部の専用スレッドではなくユーザースレッドから行われた場合に発生する可能性のあった、flush
とrun
の間での競合を解決
- GitHub #125 ログファイルのローテーションでの、(
- 詳細はChangelogを参照
Move
- バグ修正
- GitHub #30 未使用変数の警告を抑制するために、
void
へのキャストは汎用的な方法ではなかった
- GitHub #30 未使用変数の警告を抑制するために、
Mp11
mp_pairwise_fold
を追加 (Barry Revzin氏による推奨)- 破壊的変更
mp_invoke
を削除。代わりにmp_invoke_q
を使用すること
Optional
boost::none
をconstexpr
宣言- 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でのコーナーケースのビルド失敗が解決されることを期待している
- ADL検出のイベントフックを、ポリシー指定のイベントフックに置き換えた。これは脆弱性 (だれかがなにか変更した際に、フックが静かに自己無効化する)、コンパイラのバグ (コンパイラ設定の違いによるフックの間違いや、一部のフックだけが検出されるなど)、およびエンドユーザーが使用することがむずかしいなどが理由。ポリシー指定のイベントフックは、下位互換性のためにデフォルトでADL検出フックにできる。そのためには、
- バグ修正
- 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()
の変種を返す。これによりコード生成とコンテキストスイッチのパフォーマンスが大幅に向上する
- Boost.Outcomeは現在、
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++準拠のプリプロセッサにおいて、
FOR
とWHILE
のイテレーション数の最大値を指定することを許可するために、r
とd
からはじまるユーザー定義マクロのイテレーション数は、以前のリリースでそうしたように2ではなく1からはじまる。ユーザー定義マクロ内でそのようなイテレーション数が使用されている場合に破壊的変更が起こる可能性があるが (おそらくそうはならない)、最大数で数値・論理演算をする際に、ユーザー定義マクロで最大数を指定できるようにするために、いくつかの不可解なバグを修正する必要があった。標準C++準拠ではないプリプロセッサにおいて、それらには通常、最大数でのループ実行を許可しない制限があり、脆弱なプリプロセッサに破壊的変更は加えないほうがいいと考えたため、この変更は行わなかった。また、いくつかの難解なバグを修正し、ユーザー定義マクロの呼び出しによる最大数を提供する。r
とd
開始のマクロのイテレーション数が実際には何であるかについてドキュメント化されていないため、この変更を行うことができると考えた。これはイテレーション数がインクリメントされるだけだ - あらゆるコンパイラで可変引数マクロが動作することを想定するよう更新した。表面上では、これが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_condition
のoperator 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__
の間違った振る舞いを修正
- GitHub #94 再スキャン時の
テスト済みコンパイラ
主要なテストコンパイラ:
- 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