C++11新特性–Lambda表达式
Lambda表达式
功能:定义并创建匿名函数对象,以简化编程工作。
Lambda语法形式
[函数对象参数] (操作符重载函数参数) mutable或exception声明->返回值类型 {函数体}
Lambda语法分析
函数对象参数:表示Lambda开始,必须存在,不能省略。它传递给编译器自动生成函数对象类的构造函数。它只能使用定义在Lambda作用范围内可见的局部变量。其形式如下:
1) 空:没有任何函数对象参数
2) =:值传递,可见局部变量
3) &:引用传递,可见局部变量
4) this:类中成员变量
5) =, &a, &b:a和b按引用传递,其余按值传递
6) &, a, b:a和b按值传递,其余按引用传递
操作符重载函数参数:
1)():参数为空,可以省略
2)(a, b):按值传递
3)(&a, &b):按引用传递
mutable或exception声明:
1) 该部分可以省略。
2) mutable:可修改,按值传递进行拷贝
3) exception:指明函数抛出异常
->返回值类型
1)在返回类型为void或存在return时,可以省略
{函数体}
1) 标明函数的实现,不能省略,但函数体可以空相关测试
class CTest { public: CTest():m_nData(20) {} void TestLambda() { vector<int> vecTemp; vecTemp.push_back(1); vecTemp.push_back(2); cout << "Lambda:无函数对象参数" << endl; { for_each(vecTemp.begin(), vecTemp.end(), [](int v) { cout << v << endl;}); } cout << "Lambda:以值方式传递作用域内所有可见的局部变量(包括this)" << endl; { int a = 10; for_each(vecTemp.begin(), vecTemp.end(), [=](int v) { cout << v+a << endl;}); } cout << "Lambda:以引用方式传递作用域内所有可见的局部变量(包括this)" << endl; { int a = 10; for_each(vecTemp.begin(), vecTemp.end(), [&](int v){ cout << v+a << endl;}); cout << a << endl; } cout << "Lambda:以值方式传递局部变量" << endl; { int a = 10; for_each(vecTemp.begin(), vecTemp.end(), [a](int v)mutable{cout << v+a << endl; a++;}); cout << a << endl; } cout << "Lambda:以引用方式传递局部变量" << endl; { int a = 10; for_each(vecTemp.begin(), vecTemp.end(), [&a](int v)mutable{cout << v+a << endl; a++;}); cout << a << endl; } cout << "Lambda:以引用方式传递局部变量" << endl; { for_each(vecTemp.begin(), vecTemp.end(), [this](int v){cout << v+m_nData << endl;}); cout << a << endl; } cout << "Lambda:以引用方式传递局部变量" << endl; { int a = 10; for_each(vecTemp.begin(), vecTemp.end(), [&a](int v)mutable{cout << v+a << endl; a++;}); cout << a << endl; } cout << "Lambda:以引用方式传递局部变量" << endl; { for_each(vecTemp.begin(), vecTemp.end(), [this](int v){cout << v+m_nData << endl;}); } cout << "Lambda:除b按引用传递外,其他均按值传递" << endl; { int a = 10; int b = 15; for_each(vecTemp.begin(), vecTemp.end(), [=, &b](int v){ cout << v+a << endl; b++;}); cout << b << endl; } cout << "Lambda:操作符重载函数参数按值传递" << endl; { for_each(vecTemp.begin(), vecTemp.end(), [](int v){ v++; cout << v << endl;}); } cout << "Lambda:操作符重载函数参数按引用传递" << endl; { for_each(vecTemp.begin(), vecTemp.end(), [](int &v){ v++; cout << v << endl;}); } cout << "Lambda:空Lambda表达式" << endl; { [](){}(); []{}(); } } private: int m_nData; }; int main() { CTest test; test.TestLambda(); return 0; }
编译g++ -g -Wall -std=c++11 main1.cpp -o main1
执行:./main1,对应执行结果如下:Lambda:无函数对象参数 1 2 Lambda:以值方式传递作用域内所有可见的局部变量(包括this) 11 12 Lambda:以引用方式传递作用域内所有可见的局部变量(包括this) 11 12 10 Lambda:以值方式传递局部变量 11 13 10 Lambda:以引用方式传递局部变量 11 13 12 Lambda:以引用方式传递局部变量 21 22 Lambda:除b按引用传递外,其他均按值传递 11 12 17 Lambda:操作符重载函数参数按值传递 2 3 Lambda:操作符重载函数参数按引用传递 2 3 Lambda:空Lambda表达式
参考文献:https://blog.csdn.net/pleasecallmewhy/article/details/34941721