捕捉變數
回顧一下上一篇的內容,在往下討論。
Lambda 表達式的基本語法如下
1
[capture](parameters) -> return_type { body }
如果我要 capture 的變數超級多,那我要一一指名,lambda function 就會被寫得很醜, 有沒有比較優雅的方式去完成 ?
Yes!!
捕獲模式 [=] 的含義
[=] 表示 按值捕獲(capture by value)。這意味著 Lambda 表達式會拷貝外部作用域中所有使用到的變量。在 Lambda 表達式內部,這些變量的值是原始變量的副本,而且是 read-only variable 也無法被 assign value.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
int main() {
int x = 8;
int y = 24;
auto lambda = [=]() {
// 捕獲 x 和 y 的副本
std::cout << "x: " << x << ", y: " << y << std::endl;
};
// 調用 Lambda 表達式
lambda();
return 0;
}
執行結果:
在 lambda 中 assign value to x,y
1
2
3
4
5
6
7
8
9
auto lambda = [=]() {
// 捕獲 x 和 y 的副本
std::cout << "x: " << x << ", y: " << y << std::endl;
// 修改 x 和 y 的副本
// 注意:這些修改不會影響外部的 x 和 y
x = 23; // 這樣會產生編譯錯誤,因為按值捕獲的變量在 Lambda 表達式內是只讀的
y = 24; // 這樣會產生編譯錯誤,因為按值捕獲的變量在 Lambda 表達式內是只讀的
};
錯誤:
捕獲模式 [&] 的含義
捕獲模式 [&] 表示按引用捕獲(capture by reference)。這意味著 Lambda 表達式內部使用的變量是外部變量的引用,因此對這些變量的修改會直接影響外部作用域中的原始變量。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
int main() {
int x = 8;
int y = 24;
auto lambda = [&]() {
std::cout << "x: " << x << ", y: " << y << std::endl;
x = 81;
y = 81;
};
// 調用 Lambda 表達式
lambda();
// 檢查外部變量是否改變
std::cout << "Outside lambda - x: " << x << ", y: " << y << std::endl;
return 0;
}
經過 lambda() 後,x,y 都改變了
當然也可以指定哪個變數要使用 = 捕捉,哪個變數使用 & 都沒寫的話 default 就是以 = 捕捉,如下面的 x 變數一樣
1
auto lambda = [x, &y]() {};
以上,去用用看吧!happy coding.



