c++ - C++ lambda 表达式的生命周期是多少?

标签 c++ lambda c++11

(我已经阅读了What is the lifetime of lambda-derived implicit functors in C++?,它没有回答这个问题。)

我了解 C++ lambda 语法只是用于创建具有调用运算符和某些状态的匿名类的实例的糖,并且我了解该状态的生命周期要求(取决于您是否通过引用的值捕获。)但是 lambda 对象本身的生命周期是多少?在以下示例中,返回的 std::function 实例是否有用?

std::function<int(int)> meta_add(int x) {
    auto add = [x](int y) { return x + y; };
    return add;
}

如果是,它是如何工作的?这对我来说似乎有点太神奇了——我只能想象它通过 std::function 复制我的整个实例来工作,根据我捕获的内容,这可能非常重——过去我已经std::function 主要与裸函数指针一起使用,并且复制它们很快。鉴于 std::function 的类型删除,这似乎也有问题。

最佳答案

生命周期与将 lambda 替换为手动仿函数的情况完全相同:

struct lambda {
   lambda(int x) : x(x) { }
   int operator ()(int y) { return x + y; }

private:
   int x;
};

std::function<int(int)> meta_add(int x) {
   lambda add(x);
   return add;
}

对象将被创建,对 meta_add 函数是本地的,然后将 [in its entirty, including the value of x] 移动到返回值中,然后是本地实例将超出范围并正常销毁。但是,只要 std::function 对象保存它,从函数返回的对象将保持有效。这显然取决于调用上下文。

关于c++ - C++ lambda 表达式的生命周期是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7941562/

相关文章:

C++ lambda 捕获 this vs 通过引用捕获

c++ - gcc c++11 对用户定义的常量和模板参数包的限制

c++ - 如何 "enable"基于模板参数的函数?

c# - 根据 LINQ/lambda 中的 Group By 语句计数创建计数

python - 将字典理解应用于 defaultdict

c++ - Std::copy 和 std::ostream_iterator 使用重载函数打印值

C++ 最大的数值存储

c++ - 3 Function plus Main Function C 程序计算和显示阶乘

c++ - 在 C++ 中修改静态成员变量

c++ - 什么是复制省略和返回值优化?