パラメータを含む5つのローカル変数を持つローカル関数内で、たとえばstd::find_if
を実行する場合があります。しかし、ラムダは、STLアルゴリズムに渡すと、そのうちの1つにのみアクセスする必要があります。私は、次のいずれかの方法でこれをキャプチャすることができます:暗黙のキャプチャよりもラムダで明示的にキャプチャすることを好むのはいつですか?
void foo(int one, int two, int three)
{
std::vector<int> m_numbers;
int four, five;
std::find_if(m_numbers.begin(), m_numbers.end(), [=](int number) {
return number == four;
});
}
または:
void foo(int one, int two, int three)
{
std::vector<int> m_numbers;
int four, five;
std::find_if(m_numbers.begin(), m_numbers.end(), [four](int number) {
return number == four;
});
}
(構文エラーまたは他の過ちについて謝罪、私はこのコードをコンパイルしていないに注意してください)
私は暗黙のキャプチャがodr-usedのルールに基づいていることを知っています。したがって、機能的にも実装上も、私はどちらも同じだと思います。暗黙のキャプチャより明示的なキャプチャをいつ使用しますか?私の唯一の考えは、カプセル化の原則に多少関連しています。必要なものだけにアクセスできるようにすると、コンパイラは変数にアクセスしたときに判断するのを手助けすることができます。また、メソッドのローカル状態を保持します(実行中の関数の存続期間は不変です)。しかし、本当に実用的な懸念はありますか?
明示的なキャプチャを暗黙のキャプチャよりも使用する理由はありますか?フォローする親指またはベストプラクティスの良いルールは何ですか?
IIRCへの参照をダングリング取得することは危険ですそれを使用し、それを保持しません。もちろん、さまざまなシナリオで暗黙のキャプチャを使用するときに陥る可能性のあるトラップの例があります。 – chris
このようなトラップの例は非常に高く評価されます。これらの例は、相違点を比較し、良い一般的な練習規則を確立するのに役立ちます。 –
@chris Scott Meyersさんのお勧めは別の方法です。効果的な現代C++、アイテム31:デフォルトのキャプチャモードを避けます。 – LogicStuff