今日、いくつかのコードを読んでいるときに、次のようなものに出くわしました。
int v[5] = {1, 13, 17, 20, 16};
for_each(begin(v), end(v), [](int n){ cout << n << endl; });
何が起こっているのか、なんとなくわかります。std::for_each 関数を使用して、配列 v[] のすべての値を出力しています。しかし、それは何[](int n){ cout << n << endl; }
ですか?
ここに表示されているのは、C++ でのラムダ関数の使用です(これはC++11の機能です)。
ラムダ関数とは?基本的にはソースコードにインラインで書ける関数です。そうすることで、以前は別の名前付き関数を記述する必要があった場合でも、クイック関数をインラインで簡単に作成できます。
あなたの場合、ここで何が起こっているのですか:
for_each(begin(v), end(v), [](int n){ cout << n << endl; });
^^
||
これは、ここで作成しているのはラムダ関数であることをコンパイラに伝える識別子です。
for_each(begin(v), end(v), [](int n){ cout << n << endl; });
^^^^^
|||||
これは引数リストで、この場合は配列からの整数v[]
です。
for_each(begin(v), end(v), [](int n){ cout << n << endl; });
^^^^^
|||||
ここから関数本体を見ることができます。通常の関数を作成する場合と同様に、コードの残りの部分とインライン化されているだけです。
前に述べたように、ラムダ関数はインライン関数であるため、戻り値の型がどこにあるのか疑問に思うかもしれません。コンパイラは戻り値の型を推測できるため、ラムダがそれほど複雑でない場合はオプションです。あなたの場合、コンパイラはあなたの関数が何も返さないことを知っています。たとえば、明示的に int を返すようにしたい場合は、次のように、関数が返すと予想されるものをコンパイラに伝えることができます。
[] () -> int { return 2; };