为什么数据成员不能在lambda捕获列表中

时间:2014-05-22 09:43:01

标签: c++ c++11 lambda

我有一个foobar作为成员变量。

在班级的另一个成员函数中,我正在写一个lambda函数:

[bar](void){}

但我无法在捕获列表中包含bar。那是为什么?

2 个答案:

答案 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;
}