代码实现
#include <iostream>
int main() {
int num = 5;
// 值捕获方式
auto lambdaByValue = [num]() { return num * 2; };
std::cout << "值捕获结果: " << lambdaByValue() << std::endl;
// 引用捕获方式
auto lambdaByReference = [&num]() { return num * 2; };
std::cout << "引用捕获结果: " << lambdaByReference() << std::endl;
return 0;
}
捕获列表两种常见捕获方式区别
- 值捕获:
- 在值捕获中,Lambda表达式会在创建时复制捕获变量的值。
- 即使外部作用域中被捕获变量的值发生改变,Lambda内部使用的仍然是捕获时的副本值。例如在上述代码中,若在调用
lambdaByValue()
之前改变num
的值,lambdaByValue()
返回的结果不受影响,因为它使用的是捕获时num
的副本。
- 引用捕获:
- 引用捕获方式下,Lambda表达式捕获的是变量的引用。
- 这意味着如果外部作用域中被捕获变量的值发生变化,Lambda内部访问到的值也会随之改变。例如在上述代码中,若在调用
lambdaByReference()
之前改变num
的值,lambdaByReference()
返回的结果会反映num
的新值,因为它使用的是num
的引用。