私は最近、C++ 11でラムダ関数を研究していました。しかし、[=]
と[&]
の間に違いがあるかどうかはわかりません。もしあれば、違いは何ですか?ラムダ関数で[=]と[&]の間に違いはありますか?
これらの2つの状況では、ラムダボディのthis
に何か違いがありますか?参照によって
私は最近、C++ 11でラムダ関数を研究していました。しかし、[=]
と[&]
の間に違いがあるかどうかはわかりません。もしあれば、違いは何ですか?ラムダ関数で[=]と[&]の間に違いはありますか?
これらの2つの状況では、ラムダボディのthis
に何か違いがありますか?参照によって
差は値が取り込まれる方法である
&
キャプチャ=
キャプチャ値クイック例による
int x = 1;
auto valueLambda = [=]() { cout << x << endl; };
auto refLambda = [&]() { cout << x << endl; };
x = 13;
valueLambda();
refLambda();
このコードは
を印刷します1
13
最初ラムダvalueLambda
が定義されている時点での値でx
取り込みます。したがって、現在の値は1
です。しかし、refLambda
はローカルへの参照をキャプチャして最新の値を参照します。
最初の質問はすでに答えています。
あなたの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*
};
}
};
私は一つのことを指摘したいので、私はここに答えた:
this
ポインタは常に値によって捕獲されます。 C++ 11では、クラス内の変数のコピー(例えば、this->a
)をキャプチャする場合、実際には参照によって常にキャプチャされることになります。どうして?
は検討:
[this]() { ++this->a; }
this
は値によって捕捉、これはポインタであるため、this
を通して参照されています。 C++ 11で
あなたはメンバ変数のコピーをしたい場合は、このようなものか:あなたはそれを考えるまでそれが直感的ではないので
auto copy = this->a;
[copy]() { ++copy; }
は、この警告に注意してください。
ありがとう、それは私にとっては非常に明確です。 – pktangyue
ありがとうございます。私の2番目の質問はどうですか?ラムダ関数がクラスにある場合、ラムダボディの 'this'は何か違いがありますか? – pktangyue
@pktangyue 'this'は常に値によって捕捉されるので' this'の捕捉には影響しません – JaredPar