在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是我期望工作的唯一版本.