C++ 为什么成员变量是由一个;全自动;捕获,但不是通过显式命名?

C++ 为什么成员变量是由一个;全自动;捕获,但不是通过显式命名?,c++,c++11,lambda,C++,C++11,Lambda,在C++11中(从): [&]捕获lambda主体中使用的所有自动变量 引用和当前对象(如果存在) 而且 [a,&b]其中a通过副本捕获,b通过引用捕获 所以我的问题是,如果我们有一个类,比如(版本a): 在第6行中,我们使用“所有自动变量均通过引用”捕获说明符成功捕获了成员变量x 或者我们可以写(版本B): 但以下内容未编译(C版): 这是因为x在封闭范围中不作为名称存在 这也不会编译(版本D): 这是因为无法通过引用捕获此 所以,我的问题是,为什么版本A可以工作而不是版本C或版本D?我理解为

在C++11中(从):

[&]捕获lambda主体中使用的所有自动变量 引用和当前对象(如果存在)

而且

[a,&b]其中a通过副本捕获,b通过引用捕获

所以我的问题是,如果我们有一个类,比如(版本a):

在第6行中,我们使用“所有自动变量均通过引用”捕获说明符成功捕获了成员变量
x

或者我们可以写(版本B):

但以下内容未编译(C版):

这是因为
x
在封闭范围中不作为名称存在

这也不会编译(版本D):

这是因为
无法通过引用捕获此

所以,我的问题是,为什么版本A可以工作而不是版本C或版本D?我理解为什么C版和D版不起作用,但我不理解A版为什么起作用

如果我们不能通过引用捕获
,并且我们不能捕获不在父范围内的变量,那么在版本A中如何捕获
x


直观地说,根据捕获规则,B版是我希望使用的唯一版本。

A版可以使用,因为
*这是通过引用隐式实现的

如果存在捕获默认值,则可以隐式捕获当前对象(*this)


当您指定捕获默认值(本例中为
[&]
)时,
*此
被隐式捕获;它与
[此]
具有相同的效果。请注意,通过引用捕获的是
*此
,而不是
本身<代码>此
无法通过引用(如
[&this]
)显式捕获,因此版本D失败。

成员不是真正捕获的,但
是。在c++14中,您可以做类似于
[x=this->x](){/*..*/}
的事情。局部变量
x
不应该是使版本B等效的引用吗<代码>整数&x=此->x谢谢@lubgr,现在更新了问题以反映这一点。你知道为什么不允许显式捕获
这个
是有意义的,而
[&]
可以隐式捕获它吗?对,这就是我的意思。可能它只是不一致,因为
&这个
看起来像是取了指针的地址,而
&*这个
不是更好吗?@lubgr
&这个
看起来像是你想通过引用捕获
这个
本身,也许你想稍后修改
这个
指针?在捕获时,它是无效的。为了理解,它可能有助于考虑<代码>这个< /代码>总是以值作为指针传递。毕竟,即使在lambda(
[this](){this->n=7;}
)中,我们仍然需要取消引用
这个
)?@songyuanyao我的意思是:如果我们在lambda中使用
这个
,我们需要将它用作
这个->
,而不是
这个。
。这种用法是可选的/冗余的,这一点很清楚。。。
class Foo
{
    public:

    void test()
    {
        auto y = [&](){ return x; }();   // Line 6
    }

    int x;    
};
{
    int& x = this->x;
    auto y = [&x](){ return x; }();
}
{
    auto y = [&x](){ return x; }();
}
{
    auto y = [&this](){ return x; }();
}