namespace std::execution {
template<class Rcvr, class ChildOp>
concept inlinable_receiver =
receiver<Rcvr> &&
requires (ChildOp* child) {
{ remove_cvref_t<Rcvr>::make_receiver_for(child) } noexcept ->
same_as<remove_cvref_t<Rcvr>>;
};
}
概要
inlinable_receiverコンセプトは、Senderとの接続時に作成されるOperation Stateオブジェクトへのポインタから、必要に応じて再構築可能なReceiver要件を定義する。
Rcvr型のReceiverオブジェクトrcvrがOp型のOperation Stateオブジェクトopを生成するSenderに接続されていた場合、式Rcvr::make_receiver_for(addressof(op))がrcvrと等しいReceiverに評価されるときに限って、Rcvrはinlineable_receiver<Op>のモデルである。
この条件を満たすReceiverは必要に応じて再作成できるため、opのメンバ変数として保存する必要がなくなる。
ChildOpは不完全型であってもよい。
要件
オブジェクトO_0, ..., O_nに対して、下記を満たすときO_nはO_0から遷移的に構築される(transitively constructed)。
remove_cvref_t<decltype(O_n)>がremove_cvref_t<decltype(O_0)>と同じ型を表し、かつ- 下記いずれかを満たす。
O_0への参照をdecayコピーしてO_1が初期化された、もしくはn > 1かつO_{n-1}がO_0から遷移的に構築され(transitively constructed)、O_{n-1}への非constで非volatileな右辺値参照からO_nが初期化された。
説明用のEを適格な式connect(sndr, rcvr)とする。Eの評価中にrcvrから遷移的に構築される(transitively constructed)全オブジェクトの生存期間がEの評価中に終了するならば、EはReceiverrcvrをインライン化する。
これは、そのような式においてOperation StateオブジェクトにReceiverを格納する必要がないことを意味する。
説明用のEを下記のような適格な式connect(sndr, rcvr)とする。
ここで、opをEの評価結果とし、opに関連付けられた操作の仕様においてrcvrから推移的に構築されたオブジェクトを表す左辺値(glvalue)が含まれている場合、その左辺値は式remove_cvref_t<decltype(rcvr)>::make_receiver_for(addressof(op))に対して temporary materialization conversionを適用した結果を表すものとする。
StdRcvrをC++標準ライブラリで定義するReceiver型とする。Operation State型Opに対して、StdRcvrがinlinable_receiver<Op>のモデルであるかは未規定である。
StdOpをC++標準ライブラリで定義するOperation State型とし、型SndrとRcvrをis_same_v<connect_result_t<Sndr, Rcvr>, StdOp>がtrueとなる型とする。
Rcvrがinlinable_receiver<StdOp>のモデルである場合、型Rcvrのオブジェクトrcvrが与えられたとき、connect操作がReceiverrcvrをインライン化する型StdOpのオブジェクトを生成するかは処理系定義である。
備考
inlinable_receiverコンセプトは、Operation Stateオブジェクトサイズを削減する最適化の可否を表現するために導入された。C++標準の各種Senderアルゴリズムが実際にこのような最適化を行うかどうかは、処理系(標準ライブラリ実装)に依存する。
バージョン
言語
- C++26
処理系
- Clang: ??
- GCC: ??
- ICC: ??
- Visual C++: ??