lambda表达式浅析【C++学习笔记】
基本用法:
auto f = [/*捕获列表*/](/*参数*/)->int /*后置返回值类型*/{/** 函数体*/};
捕获列表:
-
[] : 不捕获任何变量
-
[变量名] : 表示值捕获,不可修改
-
[=] :按值捕获所有变量,不可修改
-
[&] : 按引用捕获可以修改
-
[this] : 在类中捕获,捕获当前类的
this
指针,如果使用 = & 捕获,则默认捕获this
指针 -
[& 变量名] :按引用捕获该变量
-
[ = , & 变量名] ; 按值捕获所有变量,但是按引用捕获变量名变量,按引用捕获的变量,每个前面都有写一个&
-
[ &,变量名] : 按引用捕获所有变量,但是按值捕获变量名变量
lambda表达式延迟调用易错点
int a = 12;auto f = [=]() ->int {return a;};a = 99;cout << f() << endl;
输出:
为什么输出不是99呢?
因为在遇到auto f = [=]() ->int
这一行时,a
的值就已经被复制到lambda表达式中了
要避免这个错误可以使用按引用捕获
lambda表达式类型
lambda表达式是闭包类型,可以理解成函数中的函数
编译器会为每个lambda表达式生成一个类,和一个可调用类对象
lambda表达式用法介绍
vector<int> vec{ 12,23,435,56,76 };int isnums = 9;for_each(vec.begin(), vec.end(), [=](int& val){val -= isnums;});for (auto value : vec){cout << value << endl;}
广义lambda捕获
解决lambda捕获依赖于类对象问题
将m_object复制到闭包里面来
[ temp = m_object]()
{return temp;};