2016-07-01 22 views
2

そこにはいくつかの類似した質問がありますが、この特定の点について明確な答えは見つかりません。`this->`を `this`をキャプチャするラムダで使用する

thisをキャプチャするラムダ内のメソッドまたはメンバ変数を呼び出すときには、this->を使用するか全く使用しないのですか、またはニュアンスの違いがありますか?

class C { 

    int var; 
    void foo(); 

    void fool() { 

     auto myLambda = [this]() { 
      // 
      this->var = 1; 
      this->foo(); 
      // 100% equivalent to? 
      var = 1; 
      foo(); 
     } 
    } 
} 
+8

それ以外に何か - ラムダ本体の中で宣言された、またはそれ以外の方法でキャプチャされた名前 'var'はありません。 –

+0

@KerrekSB私はまだ 'this'を捕まえるという意味について少し混乱していると思います。 'this 'の値をキャプチャするのではなく、' [this] 'キャプチャがクラス' C'の名前空間をラムダの中にインポートすると言うのは正しいですか? –

答えて

7

デフォルトキャプチャ[this]は両方ともインスタンスポインタを取得し、ラムダ内の名前の検索にもクラス名前空間が含まれることを意味します。したがって、一致する変数名が見つかった場合、それはキャプチャされたインスタンス内のその変数を参照します(より近いスコープでシャドーされていない限りなど)。

このように、varを使用すると、this->varの/略語と同じになります。通常のインスタンス関数内でメンバー名を使用するのとまったく同じです!

+0

入手しました。私の混乱はおそらく、「this」は変数ではなく、キーワードであるという事実によるものです。 –

+1

これは答えには十分だと思いますが、私はここに入れて応答を測定します。助けが必要な場合:lambdaを '名誉的な'メンバ関数とみなしてキャプチャすると考えることができます。キャプチャは、キャプチャされたインスタンスを除いて同じ結果を持つ、実際のメンバ関数に渡された隠された 'this ' 。ラムダを呼び出すことは、概念的には 'capturedThis-> honoraryMethod(params)'を呼び出すことと同じです。もう一つの類推は、暗黙的な逆参照であるにもかかわらず、インスタンスを指定する 'ユーザデータ'ポインタを持つクラス 'static'コールバック関数に対する共通の必要性であるかもしれません –

0

あなたは ';'を忘れました。宣言後のラムダ。

this->var = 1; 
this->foo(); 
// 100% equivalent to? 
var = 1; 
foo(); 

はいこれは同等です。

+0

詳細を教えてください。 – Gar

+0

@Gar:宣言はセミコロンで終わらなければなりません: 'int n = 10;'。あなたの 'myLambda'の宣言にはそれがありません。 –

+0

@KerrekSBガーはOPではありません。 OPがコンパイルエラーを言及しなかったので、セミコロンはおそらく転写ミスであったので、私は彼らがそれに相当するものについて精緻化を要求していたと推測します。つまり、この答えは誤字に焦点を当て、実際の問題に対処する部分については何も説明しません。そのような場合は、もっと尋ねることは有効です。 –

関連する問題