C++ Lambda表达式

lambda表达式/lambda函数/匿名函数
语法:[capture list](parameters)[mutable][throw()] -> return-type {body}
捕获列表:在C ++规范中也称为Lambda导入器,捕获列表总是出现在Lambda函数的开
        始处。实际上,[]是Lambda引出符。编译器根据该引出符判断接下来的代码
        是否是Lambda函数。捕捉列表不允许变量重复传递。
参数列表:与普通函数的参数列表一致。如果不需要参数传递,则可以连同括号“()”
        一起省略。
可变规格:mutable修饰符,默认情况下Lambda函数总是一个const函数,mutable可
        以取消其常量性。在使用该修饰符时,参数列表不可省略(即使参数为空)。
异常说明:用于Lamdba表达式内部函数抛出异常。
返回类型:不需要返回值的时候也可以连同符号”->”一起省略,在返回类型明确的情
        况下,也可以省略该部分,让编译器对返回类型进行推导。
函数体:内容与普通函数一样,不过除了可以使用参数之外,还可以使用所有捕获的变量。
附:1、除了可以使用参数以外,Lambda函数可以通过捕获列表访问一些上下文中的数据。
   2、lambda表达式不能有默认参数。
   3、所有参数必须有参数名。
   4、不支持可变参数(以传值方式捕获外部变量,则在Lambda表达式函数体中不能修
       改该外部变量的值)。
例://不捕获变量
	auto fun = ([] {
		std::cout << "Hello World!" << std::endl;
		}
	);
	fun();
	//值传递方式捕获指定变量
	int a = 10;
	auto fun = ([a] {
		std::cout << a << std::endl;
		}
	);
	fun();
	//值传递方式捕获父作用域变量
	int a = 10;
	int b = 20;
	auto fun = ([=] {
		std::cout << a << std::endl;
		std::cout << b << std::endl;
		}
	);
	fun();
	//引用传递方式捕获指定变量
	int a = 10;
	auto fun = ([&a] {
		return ++a;
		}
	);
	int b = fun();
	std::cout << b << std::endl;
	//引用传递方式捕获父作用域变量(包括this指针)
	int a = 10;
	int b = 20;
	auto fun = ([&] {
		a++;
		b++;
		}
	);
	fun();
	std::cout << a << std::endl;
	std::cout << b << std::endl;
	//拷贝+引用,注意变量的重复传递(例如:[=,b])
	int a = 10;
	int b = 20;
	auto fun = ([=, &b] {
		std::cout << (b += a) << std::endl;
		}
	);
	fun();
	//引用+拷贝,注意变量的重复传递(例如:[&,&b])
	int a = 10;
	int b = 20;
	auto fun = ([&, b] {
		std::cout << (a += b) << std::endl;
		}
	);
	fun();
	//形参接收
	auto fun = ([](int a, int b) -> int {
		return a > b ? a : b;
		}
	);
	int c = fun(10, 20);
	std::cout << c << std::endl;
	//可变规格(默认情况下lambda函数总是一个const函数,mutable可以取消其常
      量性)
	int a = 0;
	int b = 0;
	[=](int c) mutable {
		a = ++b + c;
		std::cout << a << std::endl;
		std::cout << b << std::endl;
	}(4);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值