为什么成员变量是通过"全自动"捕获捕获的,而不是通过显式命名捕获的?

j b*_*j b 15 c++ lambda c++11

在C++ 11中(来自cppreference.com):

[&]通过引用捕获lambda体中使用的所有自动变量,如果存在,则通过引用捕获当前对象

和...

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

所以我的问题是,如果我们有一个类如(VERSION A):

class Foo
{
    public:

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

    int x;    
};
Run Code Online (Sandbox Code Playgroud)

在第6行中,我们x使用"所有引用自动变量"捕获说明符成功捕获成员变量.

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

{
    int& x = this->x;
    auto y = [&x](){ return x; }();
}
Run Code Online (Sandbox Code Playgroud)

但以下不编译(VERSION C):

{
    auto y = [&x](){ return x; }();
}
Run Code Online (Sandbox Code Playgroud)

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

这也不编译(VERSION D):

{
    auto y = [&this](){ return x; }();
}
Run Code Online (Sandbox Code Playgroud)

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

所以,我的问题是,为什么 VERSION A工作而不是VERSION C或VERSION D?我理解为什么VERSION C和D不起作用,但我不明白为什么A有效.

如果我们无法this通过引用捕获,并且我们无法捕获不在父范围内的变量,那么如何x在VERSION A中捕获?

直观地说,根据捕获规则,VERSION B是我期望工作的唯一版本.

son*_*yao 14

版本A起作用,因为它*this是通过引用隐式捕获的.

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

当您指定捕获默认值([&]在本例中)时,*this将隐式捕获; 效果与...相同[this].请注意,通过引用捕获的内容*this不是this自身; this无法通过引用显式捕获[&this],因此版本D失败.