最終更新日時(UTC): 2026年01月20日 10時25分40秒
yoh が更新

履歴 編集

customization point object
<execution>

# std::execution::read_env(C++26)

    namespace std::execution {
      inline constexpr unspecified read_env{};
    }

## 概要

`read_env`は、非同期動作の開始(start)時に接続先Receiverの環境に対してクエリオブジェクトで問い合わせ、読み取った値を値完了関数で送信するSenderファクトリである。

クエリオブジェクトによるReceiver環境への問い合わせは`read_env` Sender構築時やReceiver接続(connect)ではなく、非同期動作が開始されるタイミングまで遅延される。 `let_value`Senderアダプタと組み合わせたり、Sender Awaitableなコルーチンでの`co_await`式によって、Schedulerや停止トークンを読み取ることができる。

## 効果

クエリオブジェクト `q`に対して、呼び出し式`read_env(q)`は式`make-sender(read_env, q)`と等価。

### Senderアルゴリズムタグ

Senderアルゴリズム動作説明用のクラステンプレート`impls-for`に対して、下記の特殊化が定義される。

    namespace std::execution {
      template<>
      struct impls-for<decayed-typeof<read_env>> : default-impls {
        static constexpr auto start =
          [](auto query, auto& rcvr) noexcept -> void {
            TRY-SET-VALUE(rcvr, query(get_env(rcvr)));
          };

        template<class Sndr, class Env>
        static consteval void check-types();
      };
    }

型`Q`を`decay_t<data-type<Sndr>>`とする。 `Env`型の左辺値`env`に対して式`Q()(env)`が不適格もしくは`void`型をもつとき、メンバ関数`check-types`は`unspecified-exception`型の例外を送出する。

## 備考

`read_env`のSenderアルゴリズムタグ型は未規定とされる。

## 例

    #include <print>
    #include <execution>
    namespace ex = std::execution;

    int main()
    {
      ex::sender auto sndr = ex::read_env(ex::get_scheduler)
        | ex::let_value([](auto sch) -> ex::sender auto {
            // sch := sync_wait内部のScheduler
            return ex::starts_on(sch, ex::just(42));
          });
      auto [val] = std::this_thread::sync_wait(sndr).value();
      std::println("{}", val);
    }

### 出力

    42

## バージョン

### 言語

- C++26

### 処理系

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

## 関連項目

- `execution::get_env`

## 参照

- P2300R10 `std::execution`
- P3557R3 High-Quality Sender Diagnostics with Constexpr Exceptions