有状态lambda和无状态lambda

C++11引入了lambda表达式,但有状态lambda由于闭包特性无法直接赋值给函数指针。C++20区分了有状态和无状态lambda,放宽了无状态lambda的限制,允许它们拥有默认构造函数和拷贝、移动构造函数,从而能更广泛地应用于函数对象和容器等场景。

无状态 lambda

C++11标准中新增了 lambda 表达式,可以快速精简的方式构建函数对象,而且还支持闭包,可以简单方便的捕捉当前上下文的对象。由于闭包的存在,又反过来要求闭包本身不可缺省构造和拷贝(拷贝和移动构造函数标记为 deleted ),这样和普通函数对象有区别,影响其应用。

有状态 lambda 和无状态 lambda 的区别:

#include<iostream>

using std::cout, std::endl;

int main( int argc, char * argv[] )
{
	int mm = 10;

	auto f1 = [ = ] ( int x, int y )
	{
		return x + y + mm;
	}; // <1> 有状态lambda,捕捉上下文变量

	auto f2 = [ = ] ( int x, int y )
	{
		return x + y;
	}; // <2> 有状态lambda,虽然实际未使用上下文变量,但捕捉列表中声明了默认捕捉

	auto f3 = [ ] ( int x, int y )
	{
	    return x + y;
	}; // <3> 无状态lambda

	//int (*fp1)( int , int ) = f1; // <1> Error,有状态lambda不能当普通函数对象那样赋值给函数指针
	//int (*fp2)( int , int ) = f2; // <2> Error,有状态lambda不能当普通函数对象那样赋值给函数指针
	int (*fp3)( int , int ) = f3; // <3> OK,无状态lambda可以当普通函数对象那样赋值给函数指针

	std::cout << fp3(10, 20) << std::endl;

	return 0;
}

        代码中的 f1 和 f2 都是有捕捉

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值