lambda表达式

首先看一下lambda表达式的格式

[外部变量访问方式说明符] (参数表) -> 返回值类型
{
   语句块
}

其实lambda表达式就是一个简单的函数

格式里面的参数,返回值,语句块 都是普通函数的参数 返回值和函数体

前面的访问方式说明符有两种 [&] [=]

[=]  表示变量不可被修改

[&]  和[=]相反,表示变量可以被修改

举个栗子

int main(int argc,char *argv[])
{
    auto fun = [=](int a)->int { return a; };
    cout << fun(6) << endl;
    return 0;
}

输出自然是6,这个表达式就相当于这样一个函数 输出一个int 然后return这个int

如果我将这个例子稍加改动,在return 之前先改一下a,那就要用[&]

int main(int argc,char *argv[])
{
    auto fun = [&](int &a)->int { a++; return a; };
    int a = 6;
    cout << fun(a) << endl;
    return 0;
}

当然了也可以不写返回值,这样编译器会自动识别你的返回值,如果没有返回值就返回void

int main(int argc,char *argv[])
{
    auto fun = [&](int &a){ a++; return a; };
    int a = 6;
    cout << fun(a) << endl;
    return 0;
}

[=, &x, &y]  表示外部变量 x、y 的值可以被修改,其余外部变量不能被修改;
[&, x, y]      表示除 x、y 以外的外部变量,值都可以被修改。

甚至我还可以没有参数列表

int main(int argc,char *argv[])
{
    auto fun = [&](){ cout << "a" <<endl; };
    fun();
    return 0;
}

看下面这个例子

int b = 8;

int main(int argc,char *argv[])
{
    static int a = 6;
    auto fun = [&](){ a++; return a+b; };
    cout <<fun()<<endl;
    return 0;
}

输出值为15

我没有传入参数,但是他能使用我前面定义过的全局变量和静态变量。

int b = 8;

int main(int argc,char *argv[])
{
    static int a = 6;
    int c = 8;
    auto fun = [=](){ a++; return c = a+b+c; };
    cout <<fun()<<endl;
    return 0;
}

这个代码就是错误的,因为在函数体里面改变了c的值,但是访问说明符是[=]

所以要改成

int b = 8;

int main(int argc,char *argv[])
{
    static int a = 6;
    int c = 8;
    auto fun = [&](){ a++; return c = a+b+c; };
    cout <<fun()<<endl;
    return 0;
}

这样才能得出正确结果23

原文地址:https://www.cnblogs.com/qifeng1024/p/12697068.html