在C++11中,lambda表達(dá)式可以使用捕獲列表來捕獲外部變量。捕獲列表允許lambda函數(shù)訪問外部作用域的變量,包括傳值捕獲和引用捕獲兩種方式。
捕獲列表的語法如下:
[capture_list] (parameter_list) -> return_type {
// function body
}
捕獲列表可以使用以下兩種方式進(jìn)行捕獲:
int x = 10;
auto lambda = [x] () {
cout << x << endl;
};
int x = 10;
auto lambda = [&x] () {
x++;
cout << x << endl;
};
捕獲列表還支持混合捕獲,即同時(shí)使用傳值捕獲和引用捕獲。例如:
int x = 10, y = 20;
auto lambda = [x, &y] () {
x++;
y++;
cout << x << " " << y << endl;
};
在這個(gè)例子中,x被傳值捕獲,y被引用捕獲。lambda函數(shù)內(nèi)部對(duì)x的修改不會(huì)影響外部變量x的值,而對(duì)y的修改則會(huì)影響外部變量y的值。
需要注意的是,lambda表達(dá)式默認(rèn)情況下是無法修改被傳值捕獲的外部變量的,如果需要修改傳值捕獲的變量,可以使用mutable關(guān)鍵字來修飾lambda函數(shù)。
int x = 10;
auto lambda = [x] () mutable {
x++;
cout << x << endl;
};
總的來說,lambda捕獲列表是一個(gè)非常強(qiáng)大的特性,可以方便地在lambda函數(shù)內(nèi)部訪問外部作用域的變量,并且可以靈活地選擇傳值捕獲或引用捕獲來實(shí)現(xiàn)功能。