c++ lambda表达式
参考:lambda 表达式 (C++11 起) - cppreference.com
深入浅出 C++ Lambda表达式:语法、特点和应用_c++ lamda函数作为函数参数-CSDN博客
没有显式模板形参的lambda表达式
[捕获 ] 前属性 (可选) (形参列表 ) 说明符 (可选) 异常 (可选)
后属性 (可选) 尾随类型 (可选) 约束 (可选) 约定说明 (可选) { 函数体 }
有显式模板形参的lambda表达式
[捕获 ] <模板形参 > 模板约束 (可选) 前属性 (可选) (形参列表 ) 说明符 (可选)
异常 (可选) 后属性 (可选) 尾随类型 (可选) 约束 (可选) 约定说明 (可选) { 函数体 }
捕获:指定要被捕获的实体
[]:不访问外部变量
[=]:隐式值捕获
[&]:隐式引用捕获
[变量名]:显式值捕获
[&变量名]:显式引用捕获
值捕获的变量不能在表达式内部修改,需要修改的话要加上关键字mutable,不会影响到表达式外部的变量(只是一个副本)。
int x = 10; auto f = [x] (int y) mutable -> int { return x + y; }; // 值捕获 x x = 20; // 修改外部的 x cout << f(5) << endl; // 输出 15,不受外部 x 的影响
引用捕获的变量可以直接修改表达式外部的变量。
int x = 10; auto f = [&x] (int y) -> int { return x + y; }; // 引用捕获 x x = 20; // 修改外部的 x cout << f(5) << endl; // 输出 25,受外部 x 的影响
捕获列表中不能同时写=和&(很好理解),但是允许不同类型的捕获同时存在,比如
int x = 10; int y = 20; auto f = [=, &y] (int z) -> int { return x + y + z; }; // 隐式按值捕获 x,显式按引用捕获 y x = 30; // 修改外部的 x y = 40; // 修改外部的 y cout << f(5) << endl; // 输出 55,不受外部 x 的影响,受外部 y 的影响
表示除了y按引用捕获,其他变量按值捕获。
int x = 10; int y = 20; auto f = [&, y] (int z) -> int { return x + y + z; }; // 隐式按引用捕获 x,显式按值捕获 y x = 30; // 修改外部的 x y = 40; // 修改外部的 y cout << f(5) << endl; // 输出 55,受外部 x 的影响,不受外部 y 的影响
返回值:
返回值类型需要与声明的类型一致,不然会有警告;若没有显式声明返回值类型,返回值与第一个return返回的值的类型一致,后面所有return返回的类型也必须一致,否则会报错。
补充一下函数的声明:
function<int(int)> f = [&, y] (int z) -> int { return x + y + z; };

浙公网安备 33010602011771号