Lambdaで角括弧[]でローカル変数に名前を付けることは、変数のキャプチャと呼ばれます。変数が**角括弧[] **で指定されていない場合、ラムダ式では使用できません。ラムダキャプチャ変数は、デフォルトで値によって渡されます。
次のコードなど:
#include <iostream>
#include <algorithm>
#include <iterator>
#include <vector>
using namespace std;
int main(int argc, char** argv)
{
// 初始化向量
vector<int> data{1,2,3,4,5,6,7,8,9};
int times = 3;
// 输出原始数据
// 输出
cout << "before transform:\n";
copy(data.begin(),data.end(),ostream_iterator<int>(cout,","));
cout << endl;
// 定义表达
auto op_times = [times](int i){return i * times;};
transform(data.begin(),data.end(),data.begin(),op_times);
// 输出
cout << "after transform times=" << times << endl;
copy(data.begin(),data.end(),ostream_iterator<int>(cout,","));
cout << endl;
// 改变本地变量
times = 5;
transform(data.begin(),data.end(),data.begin(),op_times);
// 输出
cout << "after transform times=" << times << endl;
copy(data.begin(),data.end(),ostream_iterator<int>(cout,","));
cout << endl;
return 0;
}
プログラム出力:
ローカル変数timesの値が3から5に変更された場合、変換関数を呼び出した結果は、各要素に5を掛けていません。これは、変換関数を2回呼び出すのと同じです。ローカル変数の時間の変化に伴って呼び出しの結果が変化することを認識するために、変数は参照によってキャプチャされる必要があります。
auto op_times = [×](int i){return i * times;};
プログラムの成果は期待に応えました!
ラムダ式が変数をキャプチャした後、キャプチャされた変数をラムダ式で変更できますか?次のコードを見てください。
#include <iostream>
#include <iostream>
#include <algorithm>
#include <iterator>
#include <vector>
using namespace std;
int main(int argc, char** argv)
{
int x{0};
auto test_func = [x](int y){
// 改变参数的值
x = 1;
y = 2;
return x + y;
};
int local{0};
cout <<"after call test_func:"<< test_func(local) <<",x = " << x <<",local=" << local << endl;
return 0;
}
コンパイルの結果は次のとおりです。
これは、値転送モードでの変数のキャプチャをLambda式で変更できないことを示しています。