
222
|
6 章 ラムダ式
•
クロージャクラス(closure class)
クロージャのインスタンス化に使用したクラスである。コンパイラはすべてのラムダに対し、
一意なクロージャクラスをそれぞれ生成する。ラムダ内の文はクロージャクラスのメンバ関
数内の実行可能命令となる。
ラムダは、関数の実引数としてのみ使用するクロージャを作成する場面で、多く用いられます。
上例の std::find_if 呼び出しもそうです。しかし、クロージャは一般にコピー可能であり、単一
のラムダに対応するクロージャ型のオブジェクトは一般に複数持てます。例を挙げます。
{
int x; // x is local variable
… x はローカル変数
auto c1 = // c1 is copy of the
[x](int y) { return x * y > 55; }; // closure produced
// by the lambda
c1 はラムダから作成した
クロージャのコピー
auto c2 = c1; // c2 is copy of c1
c2 は c1 のコピー
auto c3 = c2; // c3 is copy of c2
c3 は c2 のコピー
…
}
c1、c2、c3 はすべて、ラムダから生成したクロージャのコピーです。
正式とは言えませんが、ラムダ、クロージャ、クロージャクラスの境界線を曖昧にしてもまった
く問題ありません。しかし、以降の項目では、コンパイル時に存在するもの(ラムダとクロージャ
クラス)