メンバー関数内でラムダ関数を記述するときに、値で囲んでいるクラスのフィールドをキャプチャする方法はありますか?デフォルトのキャッチオール=
は機能しません。ラムダ内の変数を参照すると、キャプチャされたthisポインターから逆参照が取得され、キャプチャリストで変数に明示的に名前が付けられます。これは、2つのコンパイルエラーが発生するためです:capture of non-variable <name>
、‘this’ was not captured for this lambda function
いいえ、データメンバーを値でキャプチャすることはできません。ラムダがキャプチャできるのは2種類のみです。
this
ポインタ、およびコメントのildjarnで指摘されているように、データメンバーの値のコピーを使用してローカル変数を作成し、そのローカル変数を値でキャプチャできます。
ifデータメンバーの明示的な値によるキャプチャが許可されたと私は主張します。明示的なキャプチャの動作は暗黙的なキャプチャの動作とは異なるため、混乱を招く可能性があります。たとえば、int
という名前のタイプm
のアクセス可能なデータメンバーが与えられた場合、次の結果が異なる結果を生成するのは奇妙です。
[=] () mutable { m = 1; } // we modify this->m
[=m]() mutable { m = 1; } // we modify the copy of m that was captured
はい、単に[<new name>=<your class field>]
構成。例えば:
class MyClass {
int a;
void foo() {
auto my_lambda = [a_by_val=a] {
// do something with a_by_val
}
my_lambda();
}
}