測試代碼
#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中使用當前類的成員函數和成員變量。