C++ 名前付き要件: RangeAdaptorObject (C++20 以降)
From cppreference.com
Range adaptor objects は、最初の引数として viewable_range を受け取り、view を返すカスタマイズポイントオブジェクトです。一部の range adaptor object は単項であり、つまり、1つの viewable_range を唯一の引数として取ります。その他の range adaptor object は、viewable_range とその他の後続の引数を取ります。
range adaptor object が1つの引数のみを取る場合、それは RangeAdaptorClosureObject でもあります。
range adaptor object が複数の引数を取る場合、それは部分適用もサポートします。以下のようにします。
- a がそのような range adaptor object であり、
- args... が引数(一般的には後続の引数に適したもの)である場合、
式 a(args...) は以下のプロパティを持ちます。
- これは、`args...` 内の各引数 e について、`E` が decltype((e)) であり、かつ std::is_constructible_v<std::decay_t<E>, E> が true である場合にのみ有効です。
- 呼び出しが有効な場合、その結果オブジェクトは、`args...` 内の各引数 e について、std::forward<E>(e) で直接(リスト初期化以外で)初期化された std::decay_t<E> 型のサブオブジェクトを格納します(つまり、range adaptor object は引数を値でバインドします)。
- 結果オブジェクトは RangeAdaptorClosureObject です。
- RangeAdaptorClosureObject の呼び出しは、バインドされた引数(存在する場合)を関連付けられた range adaptor object に転送します。バインドされた引数(存在する場合)は、RangeAdaptorClosureObject の値カテゴリと cv 修飾を持つと見なされます。言い換えると、a(args...)(r) は std::bind_back(a, args...)(r) と等価ですが、前者はパイプ構文もサポートします。(C++23 以降)
他のカスタマイズポイントオブジェクトと同様に、以下のようにします。
- a が、いずれかの range adaptor object の型の cv 修飾されていないバージョンであるオブジェクトであり、
- args... が、a の型の `operator()` の制約を満たす任意の引数のグループである場合、
以下の呼び出しは
- a(args...),
- std::as_const(a)(args...),
- std::move(a)(args...)、および
- std::move(std::as_const(a))(args...)
すべて等価です。
これらの各式の結果オブジェクトは、view オブジェクトまたは RangeAdaptorClosureObject のいずれかです。
[編集] 注記
operator() は、range adaptor object 型の volatile 修飾または const-volatile 修飾されたバージョンではサポートされていません。配列と関数は、バインド時にポインタに変換されます。