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

 

posted @ 2025-03-27 20:31  横渡大海的神仙鱼  阅读(35)  评论(0)    收藏  举报