Home Item 5(2/2) - Lambda expression 匿名函數(中文)
Post
Cancel

Item 5(2/2) - Lambda expression 匿名函數(中文)

捕捉變數

回顧一下上一篇的內容,在往下討論。

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;
}

執行結果:

Desktop View

在 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 表達式內是只讀的
};

錯誤:

Desktop View

捕獲模式 [&] 的含義

捕獲模式 [&] 表示按引用捕獲(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 都改變了

Desktop View

當然也可以指定哪個變數要使用 = 捕捉,哪個變數使用 & 都沒寫的話 default 就是以 = 捕捉,如下面的 x 變數一樣

1
 auto lambda = [x, &y]() {};

以上,去用用看吧!happy coding.

☝ツ☝

This post is licensed under CC BY 4.0 by the author.

👈 ツ 👍