Lambda函数捕获变量vs返回值?

时间:2016-08-08 17:24:16

标签: c++ c++11 lambda

我正在学习c ++ 11新函数lambda函数,我有点困惑。 我读了那个

 []         Capture nothing (or, a scorched earth strategy?)
 [&]        Capture any referenced variable by reference
 [=]        Capture any referenced variable by making a copy
 [=, &foo]  Capture any referenced variable by making a copy, but capture variable foo by reference
 [bar]      Capture bar by making a copy; don't copy anything else
 [this]     Capture the this pointer of the enclosing class

我的问题是捕获变量意味着什么,以及返回值的区别是什么,如果要捕获变量,则必须将其返回?

例如:

[] () { int a = 2; return a; } 

为什么不是

int [] () { int a = 2; return a; }

3 个答案:

答案 0 :(得分:4)

您可以“捕获”属于封闭函数的变量。

void f() {
    int a=1;
    // This lambda is constructed with a copy of a, at value 1.
    auto l1 = [a] { return a; };
    // This lambda contains a reference to a, so its a is the same as f's.
    auto l2 = [&a] { return a; };

    a = 2;

    std::cout << l1() << "\n"; // prints 1
    std::cout << l2() << "\n"; // prints 2
}

如果需要,您可以返回捕获的变量,也可以返回其他内容。返回值与捕获无关。

答案 1 :(得分:2)

捕获列表用于将符号 带入 lambda。 返回值是指从 lambda中返回

此外,lambdas使用尾随返回类型语法,如[] () -> int { int a=2; return a; }。虽然通常最好留下明确推断的

答案 2 :(得分:1)

lambda函数的一个关键特性是它可以从声明它的范围中记住事物:

#include <iostream>
#include <vector>
#include <functional>

auto f(int i, int j) {
    int k = i * j;
    return [=](){ std::cout << k << "\n"; };
}

int main() {
    std::vector<std::function<void(void)>> v;
    v.push_back(f(2,2));
    v.push_back(f(6, 7));
    for (auto& l: v) {
        l();
    }
}

注意我们在调用lambda时不必将任何内容传递给lambda?

Lambdas本质上是围绕函子对象的语法糖,捕获是将成员变量添加到仿函数的过程:

[](char* p){ *p = toupper(*p); }

struct Lambda1 {
    int operator(char* p) const { *p = toupper(*p); }
};

int x = 42;
int y = 5;
[x, &y](int i){ return i * (x + y); }

struct Lambda2 {
    int x_;
    int& y_;
    Lambda2(int x, int& y) : x_(x), y_(y) {}
    int operator(int i) { return i*(x_ + y_); }
};

从lambda返回值是可选的,但返回值是lambda的输出,而不是输入。