#include <iostream>
using namespace std;
template <typename Func, typename A, typename B>
void templetePrint(Func func, A a, B b)
{
func(a,b);
}
void testLambda()
{
//[]默认不捕获外部定义的变量
auto funcPrint = [](int a,int b) {
cout << "funcPrint a = " << a << ", b = " << b << endl;
};
//使用
funcPrint(1, 2);//print 1 2
//作为参数传递
templetePrint(funcPrint, 3, 4);//print 3 4
int a = 1, b = 2;
//[=]以值的方式捕获,内部会得到一份lambda定义之前存在的变量和他们的值
auto funcPrint2 = [=]() {
cout << "funcPrint2 a = " << a << ", b = " << b << endl;
};
++a, ++b;
cout << "a = " << a << ", b = " << b << endl;
funcPrint2();//print 1 2
int c = 1, d = 2;
//[&]以引用方式捕获,内部会得到一份lambda定义之前存在的变量,
//但他们的值是调用时的内容,并可以在内部修改这些变量的值
auto funcPrint3 = [&]() {
cout << "funcPrint3 c = " << c << ", d = " << d << endl;
++c, ++d;
};
++c, ++d;
funcPrint3();//print 2 3
cout << "c = " << c << ", d = " << d << endl;//print 3 4
a = 1, b = 2, c = 3, d = 4;
//[a, &c]值的方式捕获a,引用的方式捕获c
auto funcPrint4 = [a, &c]() {
cout << "funcPrint4 a = " << a << ", c = " << c << endl;
};
funcPrint4();//print 1 3
//[a, &c]值的方式捕获a,引用的方式捕获c,但a被形参覆盖
auto funcPrint5 = [a, &c](int a, int b) {
cout << "funcPrint5 a = " << a << ", b = " << b << ", c = " << c << endl;
};
funcPrint5(0, 1);//print 0 1 3
}
C++11学习笔记 -- Lambda
最新推荐文章于 2024-08-09 20:53:55 发布