C++的匿名函数lambda表达式、lambda表达式捕获this

在C++11中引入了匿名函数,也就是所谓的lambda表达式;其实这个表达式在python、JAVA等语言中早就已经存在了,使用lambda表达式使代码开起来简洁。
但是凭我多年的开发经验看,很不建议大家使用这个表达式:原因是这种表达式一出现,很多人都是蒙圈的,不便于团队配合,不便于软件的后期维护,但是偏偏有一部分人喜欢使用,程序员的世界是不懂的,只能随他们去吧!!!
自己不写这类惹人蒙圈的东西,但是要能看的懂!
下面我用QT写了一个简单的例子,配置注释简单的记录一下,方便自己后期翻阅以及大家查阅。

#include <QCoreApplication>
#include <iostream>
using namespace std;

class test {
public:
	void hello() {
		cout << "test hello" << endl;
	}
	void lambda() {
		auto fun = [this]{ //this是捕获的类对象test
			this.hello();  //可以调用类对象的方法和属性
		};
		fun();  //执行上面定义的lambda函数fun
	}
}
int main(int argc, char *argv[]) {
	QCoreApplication a(argc, argv);
	int x = 1;
	int y = 2;
	//用法1(-3.5作为参数f的值传入函数内部参与计算)
	cout << [](float f) -> int {return std::abs(f);}(-3.5) << endl;
	//用法2(=的作用是捕获main函数作用域中的x,y的值,作为参数传入函数内部参与计算)
	cout << [=](){return x + y;}() << endl;
	//用法3(显式的表名函数的返回类型)
	cout << [=]() -> int {return x + y;}() << endl;
	//用法4(作用域内的参数x,y,直接参数-3.5同时传入参数内部参与运算)
	cout << [=](float f) -> int {return x + y + std::abs(f);}(-3.5) << endl;
	//用法5(把lambda表达式函数赋值给类型相同的函数指针)
	int(*add)(int, int) = [](int a, int b) -> int {return a + b;} << endl;
	int ret = add(x, y);
	cout << "ret=" << ret << endl;
	//用法6(把lambda表达式函数赋值auto类型的变量,实际上是上面函数指针的简化版)
	auto add1 = [](int a, int b) -> int {return a + b;} << endl;
	ret = add1(x, y);
	cout << "ret=" << ret << endl;
	//用法7(不想写捕获类型时,可以直接写this,但是只针对类对象有效)
	test t;
	t.lambda();
	
	return a.exec();
}

以下是捕获列表的说明

[]      // 沒有定义任何变量。使用未定义变量会引发错误。
[x, &y] // x以传值方式传入(默认),y以引用方式传入。
[&]     // 任何被使用到的外部变量都隐式地以引用方式加以引用。
[=]     // 任何被使用到的外部变量都隐式地以传值方式加以引用。
[&, x]  // x显式地以传值方式加以引用。其余变量以引用方式加以引用。
[=, &z] // z显式地以引用方式加以引用。其余变量以传值方式加以引用。

版权声明:本文为yhj_911原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。