[新特性] C++17 Lambda函数

1️⃣、使用条件

Lambda函数内部不能有:

  1. 静态变量 - static
  2. 堆区变量 - new/delete
  3. 异常捕获 - try/catch
  4. 虚函数 - virtual

2️⃣、使用方法

2.1、🛠️先定义后调用

2.1.1、定义方法

auto func = [](auto param) { // implicitly constexpr since C++17
	return param++;
};

没见过C++lambda的朋友可能对上面的语句不明所以,但他其实等价于下面这个函数:

auto func(auto param) {
    return param++;
}

返回类型(auto)之后、等号之前的,是函数名(func);圆括号内是外参(param)。

那多出来的方括号有什么用? 里面填什么?🤔

[capture clause] (parameters) mutable -> return-type { function body }
// 关键字mutable意义:
// 有,则函数体 function body 内 捕获变量capture caluse 可变;
// 无,则函数体 function body 内 捕获变量caputure caluse 常量
ret-type func = [capture clause] (parameters) mutable { function body }

方括号捕捉到的变量[capture clause],看上去似乎和圆括号的外参(parameters)没什么区别。但是方括号内是已赋值的变量,圆括号内是未赋值、必须在调用时赋值的形参。

值得一提的是,[ ] 和 ( ) 一样,若传递值则拷贝,若传递引用则可以直接访问其资源。具体案例参见文末推荐文章的“3.示例”部分

2.1.2、调用方法

Lambda函数和普通函数的调用方法也是一模一样的:

func(1);  // 返回2

2.2、🛠️作为匿名函数使用

感觉和MATLAB的句柄函数有点像,既可以先定义后调用,也可以作为匿名函数。

constexpr auto func(auto i)
{
	//use a lambda in constexpr context  

	return [i](auto j) { return i + j; };  // 匿名函数
}

推荐一篇讲解C++11 Lambda的文章,这篇文章比我讲得更加深入:C++11:lambda表达式_Man9Oo-GitCode 开源社区

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值