測試代碼
#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
總結(jié)
1).[]不捕獲任何變量丐怯。
2).[&]捕獲外部作用域中所有變量他膳,并作為引用在函數(shù)體中使用(按引用捕獲)绒窑。
3).[=]捕獲外部作用域中所有變量,并作為副本在函數(shù)體中使用(按值捕獲)蟀俊。
4).[=,&foo]按值捕獲外部作用域中所有變量,并按引用捕獲foo變量肢预。
5).[bar]按值捕獲bar變量,同時不捕獲其他變量沼本。
6).[this]捕獲當(dāng)前類中的this指針锭沟,讓lambda表達(dá)式擁有和當(dāng)前類成員函數(shù)同樣的訪問權(quán)限。如果已經(jīng)使用了&或者=族淮,就默認(rèn)添加此選項。捕獲this的目的是可以在lamda中使用當(dāng)前類的成員函數(shù)和成員變量贴妻。