我有一个foo
类bar
作为成员变量。
在班级的另一个成员函数中,我正在写一个lambda函数:
[bar](void){}
但我无法在捕获列表中包含bar
。那是为什么?
答案 0 :(得分:45)
只有具有自动存储持续时间的对象才能被C ++ 11中的lambda捕获(即局部变量和函数参数)。如果您想要捕获non-static
类数据成员的效果,您可以像Danvil's answer中一样捕获this
指针:
auto f = [this]{ std::cout << a << std::endl; };
或将数据成员的值缓存在局部变量中并捕获:
auto a = this->a;
auto f = [a]{ std::cout << a << std::endl; };
在C ++ 14中会更加简洁:
auto f = [a = this->a]{ std::cout << a << std::endl; };
这两个选项之间的选择取决于您是否要存储值a
现在有 ,或者如果要检索值a
有当lambda被称为时。请注意,在捕获this
的情况下,必须确保指针对象的生命周期包含lambda的生命周期,在销毁对象后调用lambda具有未定义的行为。捕获a
副本的更简单的情况是完全独立的,并且没有这样的终身问题。
答案 1 :(得分:24)
您可以通过在捕获列表中说出this
来捕获类成员。这与成员const
无关。
示例:
#include <iostream>
struct Foo
{
const int a = 0;
int b;
Foo() : b{42} {
auto f = [this]() { std::cout << a << " " << b << std::endl; };
// ^^^^
f();
}
};
int main() {
Foo x;
}