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++: ??