最終更新日時(UTC): 2025年07月08日 15時33分39秒
Akira Takahashi が更新

履歴 編集

type-alias
<iterator>

# std::indirect_result_t(C++20)

    namespace std {
      template<class F, class... Is>
        requires (indirectly_readable<Is> && ...) &&
                 invocable<F, iter_reference_t<Is>...>
      using indirect_result_t = invoke_result_t<F, iter_reference_t<Is>...>;
    }

## 概要

関数呼び出し可能な型`F`に間接参照可能な型（主にイテレータ型）`Is...`の指す要素を渡して呼び出した時の戻り値型を取得する。

## 例

    #include <iterator>
    #include <vector>
    #include <string>

    int main() {
      using vec_iterator = std::vector<int>::iterator;
      using pointer = double*;

      using lambda1 = decltype([](int) -> std::size_t { return 0;});
      using lambda2 = decltype([](double) -> int { return 0;});
      using lambda3 = decltype([](int, int, double, double) -> std::string { return "";});

      static_assert(std::same_as<std::indirect_result_t<lambda1, vec_iterator>, std::size_t>);
      static_assert(std::same_as<std::indirect_result_t<lambda2, pointer>     , int>);
      static_assert(std::same_as<std::indirect_result_t<lambda3, vec_iterator, const vec_iterator, pointer, const pointer>, std::string>);
    }

### 出力

## バージョン

### 言語

- C++20

### 処理系

- Clang: ??
- GCC: 10.1 ✅
- Visual C++: 2019 Update 6 ✅

## 参照

- P0896R4 The One Ranges Proposal (was Merging the Ranges TS)