我有一个类 foo
,它具有 bar
作为成员变量。
在该类的另一个成员函数中,我正在编写一个 lambda 函数:
[bar](void){}
但我不能在捕获列表中包含 bar
。这是为什么呢?
最佳答案
只有具有自动存储持续时间的对象才能被 C++11 中的 lambda 捕获(即局部变量和函数参数)。如果您想要捕获 non-static
类数据成员的效果,您可以捕获 this
指针,如 Danvil's answer :
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
拷贝的更简单的情况是完全独立的,没有这样的生命周期问题。
关于c++ - 为什么数据成员不能在 lambda 捕获列表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23803152/