最終更新日時: 2026年06月09日 16時03分31秒 (JST)
yoh が更新

履歴 編集

class template
<execution>

# std::execution::task::state(C++26)

    namespace std::execution {
      template <class T, class Environment>
        template <receiver R>
      class task<T, Environment>::state { // exposition only
      public:
        using operation_state_concept = operation_state_tag;

        template <class Rcvr>
        state(coroutine_handle<promise_type> h, Rcvr&& rr);
        ~state();

        void start() & noexcept;

        stop_token_type get-stop-token(); // exposition only

      private:
        using own-env-t = see below;      // exposition only
        coroutine_handle<promise_type> handle;  // exposition only
        remove_cvref_t<R>              rcvr;    // exposition only
        own-env-t                      own-env; // exposition only
        optional<stop_source_type>     source;  // exposition only
        Environment                    environment; // exposition only
        optional<T>                    result;  // exposition only; is_void_v<T>がfalseのときのみ有効
        exception_ptr                  error;   // exposition only
      };
    }

## 概要

`task<T,E>::state`は、タスクコルーチン動作の説明専用クラステンプレートである。

## クラス仕様

説明専用の`own-env-t`は、有効な型ならば`Environment::template env_type<decltype(get_env(declval<R>()))>`となる。そうでなければ`env<>`となる。

    template <class Rcvr>
    state(coroutine_handle<promise_type> h, Rcvr&& rr);

- 効果 :
  - `handle`を`std::move(h)`で初期化する。
  - `rcvr`を`std::forward<Rcvr>(rr)`で初期化する。
  - `own-env`を、式が有効ならば`own-env-t(get_env(rcvr))`で、そうでなければ`own-env-t()`で初期化する。いずれの式も適格でなければ、プログラムは不適格となる。
  - `environment`を、式が有効ならば`Environment(own-env)`で、そうではなく式が有効ならば`Environment(get_env(rcvr))`で、そうでなければ`Environment()`で初期化する。いずれの式も適格でなければ、プログラムは不適格となる。

    ~state();

- 効果 : 以下と等価。

      if (handle)
        handle.destroy();

    void start() & noexcept;

- 効果 : 説明用の`prom`を`handle.promise()`オブジェクトとする。`*this`と関連する`STATE(prom)`、`RCVR(prom)`、`SCHED(prom)`を下記とする。

  - `STATE(prom)` : `*this`
  - `RCVR(prom)` : `rcvr`
  - `SCHED(prom)` : 式が有効ならば`start_scheduler_type(get_start_scheduler(get_env(rcvr)))`で初期化したオブジェクト、そうでなれば`start_scheduler_type()`。いずれの式も適格でなければ、プログラムは不適格となる。

  その後、`handle.resume()`を呼び出す。

    stop_token_type get-stop-token();

- 効果 : `same_as<decltype(declval<stop_source_type>().get_token()), decltype(get_stop_token(get_env(rcvr)))>`が`true`のとき、`get_stop_token(get_env(rcvr))`を返す。そうではなく、`source.has_value()`が`false`のとき、下記の値で`source`を初期化する。

  - `source->stop_requested()`は`get_stop_token(get_env(rcvr))->stop_requested()`を返し、かつ
  - `source->stop_possible()`は`get_stop_token(get_env(rcvr))->stop_possible()`を返す。

  最後に、`source->get_token()`を返す。

## バージョン

### 言語

- C++26

## 関連項目

- `execution::task::promise_type`

## 参照

- P3552R3 Add a Coroutine Task Type
- LWG4339. `task`'s coroutine frame may be released late
- LWG4347. `task`'s stop source is always created
- P3941R4 Scheduler Affinity