最終更新日時(UTC): 2026年06月08日 01時13分52秒
yoh が更新

履歴 編集

customization point object
<execution>

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

    namespace std::execution {
      struct set_value_t { unspecified };  // タグ型

      inline constexpr set_value_t set_value{};
    }

## 概要

`set_value`は、非同期操作の正常完了を表現する値(value)完了関数である。完了関数の呼び出しは完了操作と呼ばれる。

値完了関数には完了タグ`set_value_t`が関連付けられ、完了操作の値完了シグネチャは戻り値型`set_value_t`と任意個の引数を持つ関数型として表現される。

## 効果

- 引数`rcvr`が左辺値またはconst右辺値の場合、式`set_value(rcvr, vs...)`は不適格となる。
- そうでなければ、`MANDATE-NOTHROW(rcvr.set_value(vs...))`と等価な式。

上記の式が適格なとき、その型は`void`であること。

## 例外

投げない

## カスタマイゼーションポイント

Receiver型の非const右辺値`rcvr`に対して式`rcvr.set_value(vs...)`が呼び出される。 このとき、`noexcept(rcvr.set_value(vs...)) == true`であること。

## 説明専用エンティティ

### 式`SET-VALUE`

説明用の式`rcvr`, `expr`に対して、説明専用の式`SET-VALUE(rcvr, expr)`は下記と等価である。

- `expr`の型が`void`のとき、式`(expr, set_value(std::move(rcvr)))`
- そうでなければ、式`set_value(std::move(rcvr), expr)`

### 式`TRY-EVAL`

説明用の式`rcvr`, `expr`に対して、説明専用の式`TRY-EVAL(rcvr, expr)`は下記と等価である。

- `expr`が潜在的に例外送出するならば、下記と等価。

      try {
        expr;
      } catch(...) {
        set_error(std::move(rcvr), current_exception());
      }

- そうでなければ、式`expr`

### 式`TRY-SET-VALUE`

説明用の式`rcvr`, `expr`に対して、説明専用の式`TRY-SET-VALUE(rcvr, expr)`は`rcvr`が1回だけ評価されることを除いて、下記と等価。

    TRY-EVAL(rcvr, SET-VALUE(rcvr, expr))

### 型`SET-VALUE-SIG`

説明用の型`T`に対して、説明専用の型`SET-VALUE-SIG(T)`を下記の通り定義する。

- `T`がCV修飾された`void`ならば、型`set_value_t()`
- そうでなければ、型`set_value_t(T)`

## 備考

完了関数`set_value`はSender内部実装から呼び出される想定であり、実行制御ライブラリ利用者が直接利用する必要はない。

## 例

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

    struct ValueReceiver {
      using receiver_concept = ex::receiver_tag;

      // 値完了シグネチャ set_value_t(int, int)
      void set_value(int, int) && noexcept {}
    };

    int main()
    {
      ValueReceiver rcvr;
      ex::set_value(std::move(rcvr), 1, 2);
    }

### 出力

## バージョン

### 言語

- C++26

### 処理系

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

## 関連項目

- `execution::receiver`
- `execution::set_error`
- `execution::set_stopped`

## 参照

- P2300R10 `std::execution`
- LWG4143. `execution::set_value/set_error/set_stopped/start` should always return `void`