首页 > 解决方案 > 使用成员在类中创建 lambda 表达式

问题描述

我正在尝试创建一个基于类成员返回 lambda 表达式的类成员函数。为简化起见,我创建了此示例代码。

#include <functional>

class A
{
private:
    int value;

public:
    // Default constructor
    A()
    : value(0)
    { };

    // Constructor
    A(int value)
    : value(value)
    { };

    // Returns a lambda expression
    std::function<int()> get_value()
    {
        return [](){ return value; };
        // Gives error: "error: 'this' was not captured for this lambda function"
    }
};

我知道对于这个实现,它可以更容易地编程(离开 lambda 表达式),但我认为解释和理解这个概念很好。

问题:如何在类成员 lambda 表达式中使用类成员变量?换句话说:如何在类的 lambda 函数中捕获“this”?

标签: c++classlambdamember

解决方案


如果要捕获this,则应捕获this

return [this](){ return value; };

然而,这伴随着一个常见的警告,即thislambda 捕获的内容只能在this活着的情况下使用。

附言

我知道对于这个实现,它可以更容易地编程(离开 lambda 表达式),[...]

如果你想要一个返回你的可调用对象,value那么A如果不使用 lambda 表达式,我将不知道如何(轻松地)做到这一点。我宁愿在你的设计中看到问题。如上所述,调用者需要谨慎,std::function只要A对象还活着,就只使用返回的值。有一个不明显的依赖关系,效果是你A很容易被错误地使用:

auto f = A{}.get_value();

这会创建一个破碎的std::function<int()>. 坦率地说,您的代码就是我所说的“封装非常错误”。当然,您的代码只是一个示例,但请考虑以下示例:

struct A { int value = 0; };

int main() {
    A a;
    auto f = [&](){ return a.value; };
}        

这里调用者(即 的用户)在其代码中显式地A具有依赖关系(的可用性f取决于 的生命周期)。a


推荐阅读