最終更新日時: 2025年07月09日 00時33分39秒 (JST)
Akira Takahashi が更新

履歴 編集

function template
<generator>

# std::generator::promise_type::yield_value(C++23)

    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) : 以下と等価

    value_ = addressof(val)

(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_)`を行う。そうでなければ、何もしない。

## 例外

- (1), (3), (4) : 投げない。
- (2) : 格納されるオブジェクトの初期化によって送出された例外。

## 備考

ジェネレータコルーチンの`co_yield`式は`void`型となる。

## バージョン

### 言語

- C++23

### 処理系

- Clang: ??
- GCC: ??
- ICC: ??
- Visual C++: ??

## 関連項目

- `unhandled_exception`