これは何をしますか?具体的には、ラムダに渡したい'this'オブジェクトの20のうち3つのフィールドがあります。[&]を使用すると、使用する3つのフィールドのみが使用されますか?そして、それらは参照または値によって渡されますか?
ありがとう
これ([&])は何をしますか?
すべての(暗黙の)キャプチャが参照によってキャプチャされることを指定します。つまり、実際にキャプチャされたオブジェクトによって初期化された、クロージャオブジェクトの非表示の参照メンバーが存在するかのように動作します。
ラムダに渡したい'this'オブジェクトの20のうち3つのフィールドがあります。[&]を使用すると、使用する3つのフィールドのみが使用されますか?
いいえ、this
オブジェクトのメンバーのみをキャプチャする場合は、this
ポインタのみがキャプチャされます(常に値によって)。
キャプチャー仕様は、さまざまな変数がどのようにキャプチャーされるかをコンパイラーに指示します。使用[&]
とは、ラムダ内で言及されているローカルスコープのすべての変数が参照によって参照されることを意味します。つまり、ラムダが使用されている限り、変数はそのままである必要があります。これらの変数への変更は、元の変数に反映されます。[=]
使用されている変数のコピーを格納するwhichを使用することもできます。アクセスを混在させたい場合は、デフォルトを設定し、後で変数が参照される方法をオーバーライドできます。たとえば、参照によってキャプチャされ[=,&foo]
たものを除いて、値foo
によって参照されたすべての変数をキャプチャします。
いずれの場合も、ラムダオブジェクトは、ラムダ関数内で実際に使用されている変数、またはキャプチャで明示的に(名前で)言及されている変数への参照またはコピーのみを格納します(明示的に言及されている変数は常に格納されることを指摘してくれたjpalecekに感謝します)。
上記のコンテキストでは、メンバー変数について言及しています。これらはローカルスコープにないため、キャプチャされることはありません。キャプチャできるのはですthis
が、不変であるため、常に値でキャプチャされます。不変と言えば、変数はデフォルトで値によってキャプチャされますconst
。それらを変更したい場合は、パラメーターリストとラムダ関数の本体の間にmutable
言及してラムダ関数を作成する必要があります。mutable
C ++ 11ラムダでキャプチャ仕様として使用[&]
するということは、ラムダ内で参照される変数が、キャプチャ仕様で使用して暗黙的に指定されたかのように扱われることを意味します&varname
。ラムダは、参照されていない変数をキャプチャしません。