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

履歴 編集

concept
<execution>

# std::is-awaitable(C++26)

    template<class C, class... Promise>
    concept is-awaitable;

## 概要

`is-awaitable`は、Promise型をもつコルーチンのco_await演算子オペランドにおいて`C`型オブジェクトが妥当であることを表す説明専用コンセプトである。

## 要件

説明用の式`GET-AWAITER(c, p)`を、Promise型`p`をもつコルーチン内の`co_await`演算子オペランドに適用される一連変換後の左辺値とする。

- （有効ならば）Promise型の`await_transform`メンバ関数を適用
- （有効ならば）`co_await`演算子オーバーロードを適用

`await_transform`メンバ関数を持たず`coroutine_handle<none-such>`が`coroutine_handle<void>`と同様に振る舞う未規定の空のクラス`none-such`の左辺値`p`を用いて、説明用の式`GET-AWAITER(c)`は`GET-AWAITER(c, p)`と等価とする。

また、説明用のコンセプト`await-suspend-result`, `is-awaiter`を以下のように定義する。

    template<class T>
    concept await-suspend-result = see below;

    template<class A, class... Promise>
    concept is-awaiter =
      requires (A& a, coroutine_handle<Promise...> h) {
        a.await_ready() ? 1 : 0;
        { a.await_suspend(h) } -> await-suspend-result;
        a.await_resume();
      };

下記いずれかのうち1つが`true`のとき、`await-suspend-result<T>`は`true`となる。

- `T`が`void`、もしくは
- `T`が`bool`、もしくは
- `T`が`coroutine_handle`の特殊化

`is-awaitable`コンセプトは、以下のように定義される。

    template<class C, class... Promise>
    concept is-awaitable =
      requires (C (*fc)() noexcept, Promise&... p) {
        { GET-AWAITER(fc(), p...) } -> is-awaiter<Promise...>;
      };

## バージョン

### 言語

- C++26

## 関連項目

- コルーチン

## 参照

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