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
のアクティブスタックのトップにあること。 - (3) : Promiseオブジェクトが
*this
となるコルーチンへのハンドルが、あるgenerator
オブジェクトx
のアクティブスタックのトップにあること。ジェネレータ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) :
lval
を用いて直接非リスト初期化(direct-non-list-initialized)されたremove_cvref_t<yielded>
型オブジェクトを保持し、説明専用メンバvalue_
が保持されたオブジェクトを指してコルーチンを中断(suspend)するメンバ関数をもつ、未規定の型のAwaitableオブジェクト。 - (3) : ジェネレータ
g.range
の所有権を受け取り、メンバ関数await_ready
はfalse
を返し、メンバ関数await_suspend
はx
のアクティブスタックにg.range
に対応するコルーチンハンドルをpushしてからg.range
を再開(resume)し、メンバ関数await_resume
は説明専用メンバexcept_
が例外を保持している場合にrethrow_exception(except_)
を行う、未規定の型のAwaitableオブジェクト。
例外
- (1),(3),(4) : 投げない。
- (2) : 格納されるオブジェクトの初期化によって送出された例外。
備考
この関数を呼び出すco_yield
式はvoid
型となる。
バージョン
言語
- C++23
処理系
- Clang: ??
- GCC: ??
- ICC: ??
- Visual C++: ??