C++11 Lambda函数

举报
yd_221104950 发表于 2020/12/02 23:27:35 2020/12/02
【摘要】 C++11 Lambda函数 格式如下: [捕捉列表] (参数) mutable -> 返回值类型 {函数体} 1 捕捉列表 []是lambda的引出符,捕捉列表能够捕捉上下文中的变量,来供lambda函数使用: [var] 表示以值传递的方式捕捉变量var[=] 表示以值传递的方式捕捉所有父作用域变量[&var] 表示以引用传递的方式捕捉变量v...

C++11 Lambda函数

格式如下:

[捕捉列表] (参数) mutable -> 返回值类型 {函数体}

  
 
捕捉列表

[]是lambda的引出符,捕捉列表能够捕捉上下文中的变量,来供lambda函数使用:

  • [var] 表示以值传递的方式捕捉变量var
  • [=] 表示以值传递的方式捕捉所有父作用域变量
  • [&var] 表示以引用传递的方式捕捉变量var
  • [&] 表示以引用传递的方式捕捉所有父作用域变量
  • [this] 表示以值传递的方式捕捉当前的this指针
  • [=,&a] 表示以值传递的方式捕捉其他变量,以引用传递的方式捕捉a

注意:
捕捉列表不允许变量重复传递,如:[=,a]、[&,&this],会引起编译阶段的错误。

参数
  • 参数列表与普通函数的参数列表一致。如果不需要传递参数,可以省略掉括号“()”。
mutable
  • 可以取消Lambda的常量属性。因为Lambda默认是const属性;multable仅仅是让Lamdba函数体修改值传递的变量,但是修改后并不会影响外部的变量。
->
  • 表示返回类型。如果是void时,可以省略“->”,如果返回类型很明确,也可以省略“->”,因为编译器会自动推导类型。
函数体
  • 函数体和普通函数一样,除了可以使用参数之外,还可以使用捕获的变量。

示例

  • 最简单的Lambda函数
[]{}

  
 
  • 接受参数
auto total = [](int x, int y)->int {return x + y; };

  
 
  • 以值传递的方式捕获父作用域变量
auto fun1 = [=] {return a + b; };

  
 
  • 以引用方式捕获父作用域变量,省略返回值类型
auto fun2 = [&](int c) {b = a + c; a = 1; };

  
 
  • 以值传递的方式捕获父作用域变量,以引用传递的方式捕捉b。Lambda默认是const属性,加mutaple,就可以在函数体里修改。
 auto fun3 = [=, &b](int c) mutable {b = a + c; a = 1; };

  
 
  • 综合
int main(int argc, char* argv[]){
	int a = 5, b = 7;
	// 接受参数
	auto total = [](int x, int y)->int {return x + y; }; cout << total(a, b)<<endl;  //12
	// 以值传递的方式捕获父作用域变量
	auto fun1 = [=] {return a + b; };
	cout << fun1() << endl; //12
	// 以引用方式捕获父作用域变量,省略返回值类型
	auto fun2 = [&](int c) {b = a + c; a = 1; };
	fun2(3);
	cout << a <<" "<< b << endl;
	a = 5; b = 7;   //被修改后,重新赋值
	// 以值传递的方式捕获父作用域变量,以引用传递的方式捕捉b。Lambda默认是const属性,加mutaple,就可以在函数体里修改。
	auto fun3 = [=, &b](int c) mutable {b = a + c; a = 1; }; fun3(3);
	cout << a << " " <<b<< endl; //5,8
	a = 5; b = 7;   //被修改后,重新赋值
	auto fun4 = [=](int x, int y) mutable->int {a += x; b += y; return a + b; };
	int t = fun4(10, 20);
	cout << t << endl;  //42
	cout << a <<" "<< b << endl; //5 7
	return 0;
}

  
 

特别注意

  • 块作用域以外的Lambda函数捕捉列表必须为空,块作用域以内的Lambda函数仅能捕捉块作用域以内的自动变量,捕捉任何非此作用域或非自动变量(静态变量),都会引起编译器报错。如:
Scene* MultiTouchScene::create() { return scene;
}
// 以下是错误的,捕捉列表必须为空
auto fun = [=]{};
// 正确
auto fun1 = []{};

bool MultiTouchScene::init() {
}

  
 

否则会报如下错误:

 error: non-local lambda expression cannot have a capture-default
auto fun = [=]{}; ^

  
 

谢谢阅读

文章来源: blog.csdn.net,作者:WongKyunban,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/weixin_40763897/article/details/104834898

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。