c++ lamdba表达式

语法形式:

[函数对象参数] [(表达式参数)] [mutable/exception声明] [->返回值类型] {函数体}

/**
 * c++ lambda表达式
 * 
 * 语法形式:[函数对象参数] [(表达式参数)] [mutable/exception声明] [->返回值类型] {函数体}
 * 
 * 1. 函数对象参数
 *  []  :无参数
 *  [=] :值传递所有可见的局部变量
 *  [a] :值传递局部变量a
 *  [&] :引用传递所有可见的局部变量
 *  [&a]:引用传递局部变量a
 *  [&,a]:a是值传递,其他可见的局部变量是引用传递
 *  [=,&a]:a是引用传递,其他可见的局部变量是引用传递
 *  
 * lambda的可见性不高于函数对象参数的可见性(使用了局部变量的lambda只能在局部变量可见的区域有效)
 * 
 * 2. 表达式参数(方法参数)
 *  与一般函数参数一致;若无参数,则可省略
 * 
 * 3. mutable或exception声明
 *  可省略,与函数的mutable和exception声明一致
 *  mutable声明可修改参数的拷贝
 * 
 * 4. 返回值类型
 *  可省略
 * 
 * 5. 函数体
 *  与普通函数一致
*/

#include <iostream>
using namespace std;

typedef bool (*fun)(const int &v);

void exec(fun f, int &v)
{
    bool ret = f(v);
}

fun getFun()
{
    int a = 100;
    char str[100];

    auto f0 = [a](const int &v) -> bool { return a > v; }; // 显式指定函数对象参数为a;显式指定返回值类型为bool;表达式参数v
    auto f1 = [=](const int &v) { return a > v; };         // 函数对象参数为=,函数体内可以使用所有可见的局部变量,并且是值传递方式;隐式指定返回值类型为bool
    auto f2 = [&](const int &v) { return a > v; };         // 函数对象参数为&,函数体内可以使用所有可见的局部变量,并且是引用传递方式;隐式指定返回值类型为bool
    auto f3 = [](const int &v) { return 1 > v; };          // 无函数对象参数;隐式指定返回值类型为bool
    auto f4 = [&a](const int &v) { a = v; };               // 

    auto f5 = [&a] { cout << a << endl; };                  // 省略表达式参数;省略返回值

    auto f6 = [a, str](const int &v) {};

    // return (fun)f0;  // 代码错误,使用了局部变量,则lambda不能离开局部区域
    return f3; // 无局部变量,正确
}

参考:
C++之Lambda表达式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值