suspend_always yield_value(yielded val) noexcept; // (1)
auto yield_value(const remove_reference_t<yielded>& lval)
requires is_rvalue_reference_v<yielded> &&
constructible_from<remove_cvref_t<yielded>, const remove_reference_t<yielded>&>; // (2)
template<class T2, class V2, class Alloc2, class Unused>
requires same_as<typename generator<T2, V2, Alloc2>::yielded, yielded>
auto yield_value(ranges::elements_of<generator<T2, V2, Alloc2>&&, Unused> g) noexcept; // (3)
template<ranges::input_range Rng, class Alloc>
requires convertible_to<ranges::range_reference_t<Rng>, yielded>
auto yield_value(ranges::elements_of<Rng, Alloc> r) noexcept; // (4)
概要
ジェネレータコルーチンにおけるco_yield式の動作を制御する。 プログラマが本関数を直接利用することは想定されていない。
事前条件
- (2) : Promiseオブジェクトが
*thisとなるコルーチンへのハンドルが、あるgeneratorオブジェクトxのアクティブスタックx.active_のトップにあること。 - (3) : Promiseオブジェクトが
*thisとなるコルーチンへのハンドルが、あるgeneratorオブジェクトxのアクティブスタックx.active_のトップにあること。ジェネレータg.rangeに対応するコルーチンが、初期サスペンドポイントにて中断されていること。
効果
(1) : 以下と等価
(4) : 以下と等価
auto nested = [](allocator_arg_t, Alloc, ranges::iterator_t<Rng> i,
ranges::sentinel_t<Rng> s)
-> generator<yielded, ranges::range_value_t<Rng>, Alloc> {
for (; i != s; ++i) {
co_yield static_cast<yielded>(*i);
}
};
return yield_value(ranges::elements_of(nested(
allocator_arg, r.allocator, ranges::begin(r.range), ranges::end(r.range))));
戻り値
- (1) :
suspend_always{} - (2) : 以下の動作をする未規定の型のAwaitableオブジェクト
lvalで直接非リスト初期化されたremove_cvref_t<yielded>型オブジェクトを保持する。- 説明専用メンバ
value_が保持オブジェクトを指してコルーチンを中断(suspend)するメンバ関数を持つ。
- (3) : 以下の動作をする未規定の型のAwaitableオブジェクト
- Range
g.rangeの所有権を受け取る。 - メンバ関数
await_ready:falseを返す。 - メンバ関数
await_suspend:xのアクティブスタック*x.active_にg.range.coroutine_をpushしてからg.range.coroutine_を再開(resume)する。 - メンバ関数
await_resume: 説明専用メンバexcept_が例外を保持している場合にrethrow_exception(except_)を行う。そうでなければ、何もしない。
- Range
例外
- (1), (3), (4) : 投げない。
- (2) : 格納されるオブジェクトの初期化によって送出された例外。
備考
ジェネレータコルーチンのco_yield式はvoid型となる。
バージョン
言語
- C++23
処理系
- Clang: ??
- GCC: ??
- ICC: ??
- Visual C++: ??