Lambda 函数与表达式

Lambda表达式

C++11 提供了对匿名函数的支持,称为 Lambda 函数(也叫 Lambda 表达式)。

Lambda 表达式把函数看作对象。Lambda 表达式可以像对象一样使用,比如可以将它们赋给变量作为参数传递,还可以像函数一样对其求值

Lambda 表达式本质上与函数声明非常类似。Lambda 表达式具体形式如下:

[capture](parameters)->return-type{body}
[](int x, int y){ return x < y ; }

如果没有返回值:

[capture](parameters){body}

笔记

[capture]:捕获列表,[ ]中需要捕获的值。捕获列表是空或多个捕获符的逗号分隔符列表。lambda的数据成员也在lambda对象创建时被初始化。

[] //未定义变量.试图在Lambda内使用任何外部变量都是错误的.
[x, &y] //x 按值捕获, y 按引用捕获.
[&] //用到的任何外部变量都隐式按引用捕获
[=] //用到的任何外部变量都隐式按值捕获
[&, x] //x显式地按值捕获. 其它变量按引用捕获
[=, &z] //z按引用捕获. 其它变量按值捕获
 

(parameters):参数。lambda形参列表和一般的函数形参列表类似,但不允许默认实参(C++14 前)。当以 auto 为形参类型时,该 lambda 为泛型 lambda(C++14 起)。与一个普通函数调用类似,调用一个lambda时给定的实参被用来初始化lambda的形参。

mutable:允许 函数体 修改各个复制捕获的对象,以及调用其非 const 成员函数;

    int i = 10, j = 10;
    //加上mutable才可以在lambda函数中改变捕获的变量值
    auto f = [i, &j]() mutable {i = 100, j = 100;};
    i = 0, j = 0;

返回类型 ->
当我们需要为一个lambda定义返回类型时,需要使用尾置返回类型。返回类型若缺省,则根据函数体中的 return 语句进行推断(如果有多条return语句,需要保证类型一直,否则编译器无法自动推断)。默认情况下,如果一个lambda函数体不包含return语句,则编译器假定返回void
 

auto f = []() -> double {
        if (1 > 2)
            return 1;
        else
            return 2.0;
    };

如果不显示指定返回类型,则int和double两种返回类型会导致推断冲突。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值