格式

[捕捉列表] (参数) mutable -> 返回值类型 {函数体}

lambda 表达式是一种匿名函数,即没有函数名的函数;该匿名函数是由数学中的λ演算而来的。

种类

  1. []{} 最简单的lambda函数
  2. [var] 表示以值传递方式捕捉变量var
    int main() {
        int x = 5;

        auto f = [x]{
            //x is read-only
            int y;
            y = x + 1;
            std::cout << y << std::endl;
        };

        f();

        return 0;
    }

    $>> 6
  1. [=] 表示值传递捕捉所有父作用域变量
    int main() {
        int x = 5;
        int y = 6;

        auto f = [=]{
            //x,y is read-only
            int z;
            z = x + y;
            std::cout << z << std::endl;
        };

        f();

        return 0;
    }

    $>> 11
  1. [&var] 表示以引用传递方式捕捉变量var
    int main() {
        int x = 5;

        auto f = [&x]{
            x++;
        };

        f();
        std::cout << x << std::endl;

        return 0;
    }

    $>> 6
  1. [&] 表示引用传递捕捉所有父作用域变量
    int main() {
        int x = 5;
        int y = 0;

        auto f = [&]{
            x++;
            y++;
        };

        f();
        std::cout << x << std::endl;
        std::cout << y << std::endl;

        return 0;
    }

    $>> 6
    $>> 1
  1. [this] 表示值传递方式捕捉当前的this指针
    class A {
    public:
        void foo() {
            auto f = [this] {

                bar();
            };

            f();
        }

        void bar() {
            std::cout << "bar" << std::endl;
        }
    };

    int main() {
        A a;

        a.foo();

        return 0;
    }

  1. 参数列表与普通函数的参数列表一致。若不需要传递参数,可省略。
  2. ->返回类型如果是void时,可以连->一起省略。
    int main(int argc, char** argv) {
        auto _MAX = [](int x, int y) -> int { return (x > y) ? x : y; };

        int a = 3;
        int b = 8;
        std::cout << _MAX(a, b) << std::endl;

        std::cout << [=] { return a + b; }() << std::endl;

        auto f = [&](int c) { b = a + c; a = 1; };

        f(b);
        std::cout << "a: " << a << std::endl;
        std::cout << "b: " << b << std::endl;

        a = 5; b = 7;   //被修改后,重新赋值
        auto ff = [=, &b](int c) mutable/*不加会编译报错*/ {b = a + c; a = 1; };
        ff(2);

        std::cout << "a: " << a << std::endl;
        std::cout << "b: " << b << std::endl;

    }