【问题标题】:Creating lambda expression in class using members使用成员在类中创建 lambda 表达式
【发布时间】:2020-05-28 10:50:34
【问题描述】:

我正在尝试创建一个基于类成员返回 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++ class lambda member


    【解决方案1】:

    如果你想捕获this,那么你应该捕获this

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

    但是,这伴随着一个常见的警告,即 lambda 捕获的 this 只能在 this 存在的情况下使用。

    附言

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

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

    auto f = A{}.get_value();
    

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

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

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

    【讨论】:

    • 感谢您的明确答复!需要明确的是,[&amp;](){ return a.value; } 中的 '&' 与 [this](){ return value; } 中的 'this' 代表相同?
    • @suitendaal 不,&amp; 是“通过引用捕获所有内容”的简写,请参阅 here 了解所有详细信息,这有点让人不知所措,但如果您向下滚动到“Lambda 捕获”有捕获this&amp; 的示例。
    猜你喜欢
    • 2021-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-25
    • 1970-01-01
    • 1970-01-01
    • 2019-03-21
    • 1970-01-01
    相关资源
    最近更新 更多