2014-01-14 12 views
7

私は最近、C++ 11でラムダ関数を研究していました。しかし、[=][&]の間に違いがあるかどうかはわかりません。もしあれば、違いは何ですか?ラムダ関数で[=]と[&]の間に違いはありますか?

これらの2つの状況では、ラムダボディのthisに何か違いがありますか?参照によって

答えて

14

差は値が取り込まれる方法である

  • &キャプチャ
  • =キャプチャ値

クイック例による

int x = 1; 
auto valueLambda = [=]() { cout << x << endl; }; 
auto refLambda = [&]() { cout << x << endl; }; 
x = 13; 
valueLambda(); 
refLambda(); 

このコードは

を印刷します
1 
13 

最初ラムダvalueLambdaが定義されている時点での値でx取り込みます。したがって、現在の値は1です。しかし、refLambdaはローカルへの参照をキャプチャして最新の値を参照します。

+0

ありがとうございます。私の2番目の質問はどうですか?ラムダ関数がクラスにある場合、ラムダボディの 'this'は何か違いがありますか? – pktangyue

+0

@pktangyue 'this'は常に値によって捕捉されるので' this'の捕捉には影響しません – JaredPar

0

最初の質問はすでに答えています。

あなたの2番目の疑問は、ラムダボディのこれは、そのクラスを含むクラスと同じです。次の例は標準からのものです。

struct S1 { 
    int x, y; 
    int operator()(int); 
    void f() { 
    [=]()->int { 
     return operator()(this->x + y); 
     // equivalent to S1::operator()(this->x + (*this).y) 
     // this has type S1* 
    }; 
    } 
}; 
4
  • & "参照により取り込む" を意味します。
  • = "値で取得"を意味します。

私は一つのことを指摘したいので、私はここに答えた:

thisポインタは常に値によって捕獲されます。 C++ 11では、クラス内の変数のコピー(例えば、this->a)をキャプチャする場合、実際には参照によって常にキャプチャされることになります。どうして?

は検討:

[this]() { ++this->a; } 
this

は値によって捕捉、これはポインタであるため、thisを通して参照されています。 C++ 11で

あなたはメンバ変数のコピーをしたい場合は、このようなものか:あなたはそれを考えるまでそれが直感的ではないので

auto copy = this->a; 
[copy]() { ++copy; } 

は、この警告に注意してください。

+1

ありがとう、それは私にとっては非常に明確です。 – pktangyue

関連する問題