C++ 为什么成员变量是由一个;全自动;捕获,但不是通过显式命名?
在C++11中(从): [&]捕获lambda主体中使用的所有自动变量 引用和当前对象(如果存在) 而且 [a,&b]其中a通过副本捕获,b通过引用捕获 所以我的问题是,如果我们有一个类,比如(版本a): 在第6行中,我们使用“所有自动变量均通过引用”捕获说明符成功捕获了成员变量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?我理解为
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; }();
}