最終更新日時(UTC): 2026年02月08日 09時00分28秒
yoh が更新

履歴 編集

customization point object
<execution>

# std::execution::stop-when(C++26)

    namespace std::execution {
      inline constexpr unspecified stop-when{};
    }

## 概要

`stop-when`は、入力Senderに追加の停止トークンを結合したSenderを返す、説明専用のSenderアダプタである。

説明用の式`sndr`と`token`に対して、

- `decltype((sndr))`が`sender`を満たさない、もしくは`remove_cvref_t<decltype((token))>`が`stoppable_token`を満たさないとき、式`stop-when(sndr, token)`は不適格となる。
- そうでなく、`remove_cvref_t<decltype((token))>`が`unstoppable_token`のモデルであるとき、式`stop-when(sndr, token)`は、`token`と`sndr`が不定順で順序付けられることを除いて、`(void)token, sndr`と等価となる。
- そうでないとき、式`stop-when(sndr, token)`はSender`osndr`を返す。`osndr`がReceiver `r`と接続(connect)されるとき、`get_stop_token(get_env(r))`の結果を`rtoken`とする。
  - `rtoken`の型が`unstoppable_token`のモデルであるとき、`osdnr`と`r`との接続の効果は`connect(write_env(sndr, prop(get_stop_token, token)), r)`に等しい。
  - そうでないとき、下記のような説明専用の型`stoken-t`の`stoken`オブジェクトに対して、`osdnr`と`r`との接続の効果は`connect(write_env(sndr, prop(get_stop_token, stoken)), r)`に等しい。
    - `stoken-t`は`stoppable_token`のモデルである。
    - `stoken.stop_requested()`は`token.stop_requested() || rtoken.stop_requested()`を返す。
    - `stoken.stop_possible()`は`token.stop_possible() || rtoken.stop_possible()`を返す。
    - 説明用の型`Fn`と`Init`が`invocable<Fn>`および`constructible_from<Fn, Init>`のモデルであるとき、`stoken-t::callback_type<Fn>`は`stoppable-callback-for`のモデルである。

## バージョン

### 言語

- C++26

## 関連項目

- `execution::spawn_future`
- `execution::counting_scope::token::wrap`

## 参照

- P3149R11 `async_scope` - Creating scopes for non-sequential concurrency
- LWG4461 `stop-when` needs to evaluate unstoppable tokens