web-dev-qa-db-ja.com

値クラスメンバーによるキャプチャ

メンバー関数内でラムダ関数を記述するときに、値で囲んでいるクラスのフィールドをキャプチャする方法はありますか?デフォルトのキャッチオール=は機能しません。ラムダ内の変数を参照すると、キャプチャされたthisポインターから逆参照が取得され、キャプチャリストで変数に明示的に名前が付けられます。これは、2つのコンパイルエラーが発生するためです:capture of non-variable <name>‘this’ was not captured for this lambda function

28
Lorenzo Pistone

いいえ、データメンバーを値でキャプチャすることはできません。ラムダがキャプチャできるのは2種類のみです。

  1. thisポインタ、および
  2. 非静的ローカル変数(つまり、自動保存期間を持つ変数)。

コメントのildjarnで指摘されているように、データメンバーの値のコピーを使用してローカル変数を作成し、そのローカル変数を値でキャプチャできます。

ifデータメンバーの明示的な値によるキャプチャが許可されたと私は主張します。明示的なキャプチャの動作は暗黙的なキャプチャの動作とは異なるため、混乱を招く可能性があります。たとえば、intという名前のタイプmのアクセス可能なデータメンバーが与えられた場合、次の結果が異なる結果を生成するのは奇妙です。

[=] () mutable { m = 1; } // we modify this->m
[=m]() mutable { m = 1; } // we modify the copy of m that was captured
30
James McNellis

はい、単に[<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();
    }
}
2
Vlad Zolotarov