コーディング スタイルに関して、人々は C++0x ラムダをどのように使用しているのでしょうか。最も興味深い質問は、キャプチャ リストを作成する際にどの程度徹底するかということです。一方では、言語はキャプチャされた変数を明示的にリストすることを許可し、「明示的なルールは暗黙的なルールよりも優れている」ため、意図を明確に述べるために網羅的なリストを作成することは理にかなっています。例えば:
int sum;
std::for_each(xs.begin(), xs.end(), [&sum](int x) { sum += x });
これに対するもう 1 つの議論は、ref キャプチャされたローカルの有効期間は、キャプチャされたという理由だけで変更されないため (したがって、ラムダは、有効期間が長い間終了しているローカルを簡単に参照してしまう可能性があるため)、キャプチャを明示的にすると、そのようなバグを減らすのに役立つということです。そしてそれらを追跡します。
一方、この言語は、参照されているすべてのローカルを自動キャプチャするためのショートカットも意図的に提供しているため、明らかに使用することを意図しています。そして、上記のような例では、自動キャプチャでも何が起こるかは非常に明確であり、ラムダの寿命は周囲のスコープよりも長生きしないため、使用しない理由はないと主張できます:
int sum;
std::for_each(xs.begin(), xs.end(), [&](int x) { sum += x });
明らかに、これはオール オア ナッシングである必要はありませんが、いつ自動キャプチャするか、いつキャプチャを明示的に行うかを決定する何らかの論理的根拠が必要です。何かご意見は?
同様に、capture-by-copy -[=]
をいつ使用するか、capture-by-reference - をいつ使用するかという問題もあり[&]
ます。キャプチャによるコピーは、有効期間の問題がないため、明らかに安全です。そのため、キャプチャされた値を変更する必要がない場合 (または他の場所からの変更を確認する必要がない場合) は常にデフォルトで使用する必要があると主張できます。そのような場合、参照による参照は (時期尚早の可能性がある) 最適化として扱われ、明らかに違いが生じる場合にのみ適用されます。
一方、参照によるキャプチャはほとんどの場合高速です (特に、ほとんどの STL アルゴリズムなどの小さな型やインライン化可能なテンプレート関数の場合、コピーが実際に高速である場合は、コピーに最適化できることが多いため)、ラムダがそのスコープを超えない場合は安全です (これはすべての STL アルゴリズムの場合でもあります)。したがって、この場合の参照によるキャプチャをデフォルトにすることは、問題のない簡単で無害な最適化です。
あなたの考えは何ですか?