C++ Lambda表达式(还是比较习惯叫匿名函数)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/w442863748/article/details/51919534
不太情愿, 但不得不承认, 我是最近才知道Lambda这个词(前几天丢人丢大了), 这是作为一个程序猿的失职, 虽然很早以前就听说过"匿名函数", 这里记下, 引以为戒.
Lambda表达式, 又称匿名函数:
[capture](parameters) mutable ->return-type{statement}
[capture]: 捕捉列表. 捕捉列表总是出现在Lambda函数的开始处. 实际上, []是Lambda引出符. 编译器根据该引出符判断接下来的代码是否是Lambda函数. 捕捉列表能够捕捉上下文中的变量以供Lambda函数使用
[var]表示值传递方式捕捉变量var
[=]表示值传递方式捕捉所有父作用域的变量包, 括this
[&var]表示引用传递捕捉变量var
[&]表示引用传递方式捕捉所有父作用域的变量, 包括this
[this]表示值传递方式捕捉当前的this指针
可以连用如:[=,&a,&b]表示以引用传递的方式捕捉变量a和b,以值传递方式捕捉其它所有变量
注意:捕捉列表不允许变量重复传递如[&,&a]
(parameters): 参数列表. 与普通函数的参数列表一致. 如果不需要参数传递, 则可以连同括号“()”一起省略
mutable: mutable修饰符. 默认情况下, Lambda函数总是一个const函数, mutable可以取消其常量性. 在使用该修饰符时, 参数列表不可省略(即使参数为空)
->return-type: 返回类型. 用追踪返回类型形式声明函数的返回类型. 我们可以在不需要返回值的时候也可以连同符号”->”一起省略. 此外, 在返回类型明确的情况下, 也可以省略该部分, 让编译器对返回类型进行推导
{statement}: 函数体. 内容与普通函数一样, 不过除了可以使用参数之外, 还可以使用所有捕获的变量

值得注意的是: 默认情况下,Lambda函数总是一个const函数,mutable可以取消其常量性。按照规定,一个const的成员函数是不能在函数体内修改非静态成员变量的值

#include <iostream>

using namespace std;

typedef enum
{
	add = 0,
	sub,
	mul,
	divi
}op;

int main(int argc, char* argv[])
{
	int a = 1, b = 2;

	auto func = [=](op i) -> int
	{
		switch(i)
		{
		case add:
			return a + b;
		case sub:
			return a - b;
		case mul:
			return a * b;
		case divi:
			return a / b;
		}
	};
	
	cout << func(add) << endl;//3

	int c = 11;

	auto func1 = [=]{cout << c + 1 << endl;};//c被视为一个常量,一旦初始化后不会再改变(可以认为之后只是一个跟父作用域中c同名的常量)
	auto func2 = [&]{cout << c + 1 << endl;};


	func1();//12
	func2();//12

	c++;

	func1();//12
	func2();//13

	system("pause");
	return 0;
}


猜你喜欢

转载自blog.csdn.net/w442863748/article/details/51919534