lambda@C++0x - 値か参照か,それが問題だ

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 を保持しているのか知らないので,もしかしたら楽じゃないのかも知れない)