最終更新日時: 2025年07月10日 10時26分30秒 (JST)
Koichi Murase が更新

履歴 編集

# autoパラメータによる関数テンプレートの簡易定義(C++20)

このページはC++20に採用された言語機能の変更を解説しています。

のちのC++規格でさらに変更される場合があるため関連項目を参照してください。

## 概要

C++14で導入されたジェネリックラムダと同様に、通常の関数もパラメータ型を`auto`にすることで、簡易的に関数テンプレートを定義できるようにする。

パラメータ型を`auto`としたそれぞれのパラメータに対して、個別にテンプレートパラメータが割り振られる。

制限としては、以下のようなものがある：

- パラメータ型に`decltype(auto)`は使用できない
- `std::vector<auto>`のように型の一部を`auto`にはできない

`auto`で定義した変数の型をとりたい場合は、`decltype`を使用する。

## 例

    #include <iostream>

    auto f(auto a, auto b) { return a + b; }

    // 以下と同じ意味になる：
    // template <class T, class U>
    // auto f(T a, U b) { return a + b; }

    int main()
    {
      // パラメータaとbの型はint
      std::cout << f(1, 2) << std::endl;

      // パラメータaとbの型はdouble
      std::cout << f(0.1, 0.2) << std::endl;
    }

### 出力

    3
    0.3

## 関連項目

- C++14 ジェネリックラムダ
- C++20 コンセプト

## 参照

- P1141R2 Yet another approach for constrained declarations