最終更新日時: 2025年08月21日 20時27分10秒 (JST)
yoh が更新

履歴 編集

customization point object
<execution>

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

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

## 概要

`write_env`は、入力Senderとクエリ可能オブジェクトを受け取り、Receiver `rcvr`と接続(connect)される際に、クエリ可能オブジェクトと`get_env(rcvr)`を合成した環境に関連付けられたReceiverと接続されるSenderを生成するSenderアダプタである。

## 効果

説明用の式`sndr`と`env`に対して、`decltype((sndr))`が`sender`を満たさない、もしくは`decltype((env))`が`queryable`を満たさないとき、呼び出し式`write_env(sndr, env)`は不適格となる。

そうでなければ、呼び出し式`write_env(sndr, env)`は式`make-sender(write_env, env, sndr)`と等価。

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

説明用の`write-env-t`を`decltype(auto(write_env))`とする。

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

    template<>
    struct impls-for<write-env-t> : default-impls {
      static constexpr auto join-env(const auto& state, const auto& env) noexcept {
        return see below;
      }

      static constexpr auto get-env =
        [](auto, const auto& state, const auto& rcvr) noexcept {
          return join-env(state, FWD-ENV(get_env(rcvr)));
        };

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

`impls-for<write-env-t>::join-env`メンバの呼び出しは下記を満たすオブジェクト`e`を返す。

- 型`decltype(e)`が`queryable`のモデルであり、かつ
- 与えられたクエリオブジェクト `q`に対して、式`e.query(q)`は式`state.query(q)`が有効ならばその式と等価。そうでなければ、式`e.query(q)`は`env.query(q)`と等価。
- 型`Sndr`と型パック`Env`に対して、型`State`を`data-type<Sndr>`とし、パック`JoinEnv`を`decltype(join-env(declval<State>(), FWD-ENV(declval<Env>())))`とする。式`impls-for<write-env-t>::check-types<Sndr, Env...>()`は`get_completion_signatures<child-type<Sndr>, JoinEnv...>()`と等価。

## バージョン

### 言語

- C++26

### 処理系

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

## 関連項目

- `execution::on`
- `execution::unstoppable`

## 参照

- P2300R10 `std::execution`
- P3396R1 std::execution wording fixes
- P3557R3 High-Quality Sender Diagnostics with Constexpr Exceptions
- P3284R4 `write_env` and `unstoppable` Sender Adaptors