http://shinh.skr.jp/m/?date=20080213#p02
今の lambda@C++0x の提案は bind を作成する + bind に渡す関数の定義を inline に書ける,という理解でだいたいよいと思う.ので,「必要なものだけ boost::bind かそれに類するものにぶちこんで持ち運ぶ」のはまったくその通りだと思うのだけれど,恐らく最大の争点は「どうぶち込むのか」,つまり
- 値 (のコピー) でぶち込む,なのか
- 参照でぶち込む,なのか
とゆ〜.
値のコピーでぶち込んだ場合
vector<int> v; //... int sum = 0; // v の要素の和を sum に代入したい for_each(v.begin(), v.end(), <>(int i)(sum += i;)); // lambda 定義内の sum は environment である変数 sum のコピー // でもこれだと closure 内の sum しか変わらないよー?
とか
vector<int> v; //... HeavyToCopy heavy; for_each(v.begin(), v.end(), <>(int &i)(i += heavy.get();)); // lambda 定義内の heavy は変数 heavy のコピー // でも heavy のコピーが重たいよー?
とか
void f(Base const &b) { vector<int> v; //... for_each(v.begin(), v.end(), <>(int &i)(i += b.get();)); // lambda 定義内の b は引数 b のコピー // でも,実際の型が Derived だったら // b をコピーするときに slicing するかも知れないよー? }
とかいった色々楽しい問題がある.
一方で,参照で持つと
function<void(int)> f(){ int i = 42; return <>(int e)(i += e; cout << i << endl;); // lambda 定義内の i は i への参照 // でもこれは鼻から悪魔さん出てきてくださーいって // 言ってるようなものだよー? }
というとても楽しい問題がある.
で,どうしましょう?ってゆ〜.
楽よね! GC のある言語! (GC のある言語で closure がどう environment を保持しているのか知らないので,もしかしたら楽じゃないのかも知れない)