1 lamada 的函数指针存在哪里?需要通过分析编译后的二进制;
2 捕获了什么? 为什么捕获?捕获的范围是什么? 捕获的生命周期是什么?
lambda 定义匿名函数,使得代码更加灵活简洁;
lambda表达式格式:
auto func = [capture] (params) opt -> ret { func_body; };
func:lambda 表达式的名字,作为一个函数使用;
capture:捕获列表;
params:参数列表;
opt:函数选项(mutable, noexcept之类);
ret:返回值类型,如果不写,编译器根据返回值自动推导;
func_body:函数体。
capture 格式:
[] //未捕获任何变量。试图在lambda内使用任何外部变量都是错误的;
[&] //用到的任何外部变量都隐式按引用捕获
[=] //用到的任何外部变量都隐式按值捕获
[x, &y] //x 按值捕获, y 按引用捕获.
[&, x] //x显式地按值捕获. 其它变量按引用捕获
[=, &z] //z按引用捕获. 其它变量按值捕获
[this]:通过引用捕获当前对象(其实是复制指针)
[*this]:通过传值方式捕获当前对象;
#include <iostream>
#include <string>
#include <functional>
int main() {
int va = 1, vb = 2, vc = 3;
//auto lf1 = [](){return va;};
auto lf2 = [=](){return vb;};
auto lf3 = [=](){return va++;};
return 0;
}
编译错误信息:
06 g++ lambda.cpp
lambda.cpp: In lambda function:
lambda.cpp:10:29: error: increment of read-only variable ‘va’
10 | auto lf3 = [=](){return va++;};
好问题:auto lf3 = [=](){return va++;}; 为什么会报错;
每天在工作之余坚持研究一个小问题,感觉时间还是有点紧,只能切分了。
参考文档: