测试代码
#include <iostream>
int main()
{
int testvalueA = 1;
auto testFuncA = [=](int a, int b)->int {
//testvalueA += 1; //readonly
std::cout<<"##inter "<<testvalueA<<std::endl;
return a+b +testvalueA;
};
std::cout<<testvalueA<<std::endl;
testFuncA(1,1);
std::cout<<testvalueA<<std::endl;
std::cout<<std::endl;
int testvalueB = 1;
auto testFuncB = [&](int a, int b)->int {
testvalueB += 1;
std::cout<<"##inter "<<testvalueB<<std::endl;
return a+b + testvalueB;
};
std::cout<<testvalueB<<std::endl;
testFuncB(1,1);
std::cout<<testvalueB<<std::endl;
std::cout<<std::endl;
int testvalueC = 1;
int testvalueD = 1;
auto testFuncC = [testvalueC, &testvalueD](int a, int b)->int {
//testvalueC += 1; //readonly
testvalueD += 1;
std::cout<<"##inter "<<testvalueC<<" "<<testvalueD<<std::endl;
return a+b;
};
std::cout<<testvalueC<<" "<<testvalueD<<std::endl;
testFuncC(1,1);
std::cout<<testvalueC<<" "<<testvalueD<<std::endl;
return 0;
}
编译输出
g++ -std=c++11 -o out lambdatest.cpp && ./out
1
##inter 1
1
1
##inter 2
2
1 1
##inter 1 2
1 2
总结
1).[]不捕获任何变量。
2).[&]捕获外部作用域中所有变量,并作为引用在函数体中使用(按引用捕获)。
3).[=]捕获外部作用域中所有变量,并作为副本在函数体中使用(按值捕获)。
4).[=,&foo]按值捕获外部作用域中所有变量,并按引用捕获foo变量。
5).[bar]按值捕获bar变量,同时不捕获其他变量。
6).[this]捕获当前类中的this指针,让lambda表达式拥有和当前类成员函数同样的访问权限。如果已经使用了&或者=,就默认添加此选项。捕获this的目的是可以在lamda中使用当前类的成员函数和成员变量。