this
ラムダでキャプチャする(オブジェクトプロパティを変更する)正しい方法は次のとおりです。
auto f = [this] () { /* ... */ };
しかし、私が見た次の特異性について興味があります。
class C {
public:
void foo() {
// auto f = [] () { // this not captured
auto f = [&] () { // why does this work?
// auto f = [&this] () { // Expected ',' before 'this'
// auto f = [this] () { // works as expected
x = 5;
};
f();
}
private:
int x;
};
私が混乱している(そして答えたい)奇妙なことは、以下が機能する理由です:
auto f = [&] () { /* ... */ }; // capture everything by reference
そして、なぜ私がthis
参照によって明示的にキャプチャできないのか:
auto f = [&this] () { /* ... */ }; // a compiler error as seen above.
this
と思われるものに関しては、変更できない、参照を高速化するのに十分な大きさではない...そしてとにかく、実際には存在しないので、実際の寿命はありません。つまり、それへの参照は定義上ぶら下がっています。this
はprvalueであり、lvalueではありません。