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

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy