c++ - 非捕获 lambda 生命周期

标签 c++ lambda

如果以下代码在两种情况下都是正确的,无论是非捕获 lambda 还是调用静态函数,我都很难找到明确的答案。我很确定后者很好,我担心的是在另一个块/函数调用中“定义”时 lambda 的生命周期,等等。代码似乎工作正常,但我仍然想知道为什么...非捕获 lambda 最终是否被定义为某种匿名(隐藏)全局符号,因此它与该静态函数基本相同?

#include <cstdio>
class Listener {
public:
    void event() { printf("event() called\n"); }

    static void forwardEvent(void* userArg) { static_cast<Listener*>(userArg)->event(); }
};

class Producer {
    using Listener = void(void* arg);
    Listener* listener_;
    void* userArg_;

public:
    void attachListener(Listener* listener, void* userArg) {
        listener_ = listener;
        userArg_ = userArg;
    }

    void issueEvent() { listener_(userArg_); }
};

int main() {
    Listener listener;
    Producer producer;

    {  // different scope, in case that makes a difference...
        producer.attachListener(Listener::forwardEvent, &listener);
    }
    producer.issueEvent();

    {  // different scope, in case that makes a difference...
        producer.attachListener([](void* userArg) { static_cast<Listener*>(userArg)->event(); }, &listener);
    }
    producer.issueEvent();
}

最佳答案

好的,所以你的嵌套 Listener定义是这样的。

using Listener = void(void* arg);
Listener* listener_;
基本上,您处理的是好的旧函数指针。现在,当您为函数指针传递参数时,您可以这样做
producer.attachListener([](void* userArg) { static_cast<Listener*>(userArg)->event(); }, &listener);
非捕获 lambda 通过隐式转换转换为函数指针。这个函数指针是
  • 保证有效,并指向
  • 的函数
  • 行为与 lambda 的 operator() 完全相同被称为。

  • 函数在程序的整个持续时间内“存在”,它们的地址永远不会变成悬空。因此,就使用从 lambda 表达式获得的指针而言,您的代码具有明确定义的行为。

    关于c++ - 非捕获 lambda 生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64159461/

    相关文章:

    c++ - 如何使用 uniform_int_distribution 作为构造函数中的类字段

    python - 支持 Nan 的 Pandas Lambda 函数

    python - 在python中使用多个条件对列表进行排序

    c++ - `for_each_arg` 的正确用法 - 转发过多?

    java - 如何将 Stream<List<Long>> flatMapToLong?

    c# - ExpressionTree 作为方法参数接受任何方法

    c++ - 使用c++修改的未关闭的文本文件安全吗?

    c++ - 如果将 a 类实例声明为 A a,那么 a 类实例将位于内存中的哪个位置?

    C++ FTP 写入文件不起作用

    c++ - num_get facet 和 stringstream 转换为 bool 值 - 初始化 bool 值失败?