このページは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