无状态 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 都是有捕捉

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

被折叠的 条评论
为什么被折叠?



