最終更新日時(UTC):
が更新

履歴 編集

concept
<execution>

std::execution::inlinable_receiver(C++26)

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オブジェクトrcvrOp型のOperation Stateオブジェクトopを生成するSenderに接続されていた場合、式Rcvr::make_receiver_for(addressof(op))rcvrと等しいReceiverに評価されるときに限って、Rcvrinlineable_receiver<Op>のモデルである。 この条件を満たすReceiverは必要に応じて再作成できるため、opのメンバ変数として保存する必要がなくなる。

ChildOp不完全型であってもよい。

要件

オブジェクトO_0, ..., O_nに対して、下記を満たすときO_nO_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の評価中に終了するならば、EReceiverrcvrをインライン化する。 これは、そのような式においてOperation StateオブジェクトにReceiverを格納する必要がないことを意味する。

説明用のEを下記のような適格な式connect(sndr, rcvr)とする。

  • sndrをC++標準ライブラリで定義するSender型とし、かつ
  • EReceiverrcvrをインライン化する。

ここで、opEの評価結果とし、opに関連付けられた操作の仕様においてrcvrから推移的に構築されたオブジェクトを表す左辺値(glvalue)が含まれている場合、その左辺値は式remove_cvref_t<decltype(rcvr)>::make_receiver_for(addressof(op))に対して temporary materialization conversionを適用した結果を表すものとする。

StdRcvrをC++標準ライブラリで定義するReceiver型とする。Operation StateOpに対して、StdRcvrinlinable_receiver<Op>のモデルであるかは未規定である。

StdOpをC++標準ライブラリで定義するOperation State型とし、型SndrRcvris_same_v<connect_result_t<Sndr, Rcvr>, StdOp>trueとなる型とする。 Rcvrinlinable_receiver<StdOp>のモデルである場合、型Rcvrのオブジェクトrcvrが与えられたとき、connect操作がReceiverrcvrをインライン化する型StdOpのオブジェクトを生成するかは処理系定義である。

備考

inlinable_receiverコンセプトは、Operation Stateオブジェクトサイズを削減する最適化の可否を表現するために導入された。C++標準の各種Senderアルゴリズムが実際にこのような最適化を行うかどうかは、処理系(標準ライブラリ実装)に依存する。

バージョン

言語

  • C++26

処理系

関連項目

参照