我了解this
在lambda中捕获(修改对象属性)的正确方法如下:
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。