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



