C++ lambda表达式
Posted WhiteShirtI
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ lambda表达式相关的知识,希望对你有一定的参考价值。
lambda表达式最先出现于python脚本语言,在运行时候才会一行一行的解释指令,速度虽然满,但是对于程序员来说减少了大量的代码工作,语法相对更加简单
lambda表达式是一个匿名的函数
完整表达式:[capture-list](parameters)mutable->return-typestatement
[]
中的变量就是可以将上下文中的变量引入到匿名函数中去使用,默认属性为const
()
中的变量为函数的参数列表,定义方式和普通函数一样,可省略,但是如果添加mutable属性后即使()为空也需要显示写出
mutable
的作用是将[]的变量属性修改为非const。可省略
->return-type
为函数的返回值,但是编译器可以自动推导,可省略
为函数体,可以使用[]和()内的变量
void test()
int a = 10;
int b = 20;
[a, b] return a + b; ;
[a, b](int c) return a + b + c; ;
[a, b](int c) ->intreturn a + b + c; ;
[a, b]()mutablea = 100; b = 200; ;
[] ;
如果要使用lambda表达式,可以定义一个auto变量来接收这个匿名函数
void test()
int a = 10;
int b = 20;
auto fun = [a, b](int c) ->intreturn a + b + c; ;
int ret = fun(10);
cout << ret << endl;
[]
如果要捕捉多个变量,如果一个一个写会非常麻烦,此时C++也引入了需要的语法来便捷操作
[=]
:以值的形式捕捉上下文的所有变量(包括this指针)
[&]
:以引用的形式捕捉上下文的所有变量(包括this指针)
[&x]
:以引用博主的方式捕捉x
[=, &x]
:x变量以引用方式来捕捉,其他变量都以值形式捕捉
[&, x]
:x变量以值方式来捕捉,其他变量都以引用形式捕捉
[this]
:以值形式来捕捉当前的this指针
错误捕捉方式:[=, x]
、[&, &x]
重复捕捉
class A
public:
void fun(int a)
[this]() return this->_a; ;
private:
int _a;
;
void test()
int a = 10;
int b = 20;
auto fun = [=](int c) ->intreturn a + b + c; ;
auto fun1 = [&](int c) ->int return a + b + c; ;
auto fun2 = [&a](int c) ->int return a + c; ;
auto fun3 = [=, &a](int c) ->int return a + b + c;;
auto fun4 = [&, a](int c) ->int return a + b + c; ;
不能捕捉不在同一作用域中的变量或者是非局部变量的变量
int g = 10;
void test()
int t = 20;
auto f = [g] ;//error
int main()
auto f1 = [t] ;//error
test();
return 0;
不能进行赋值,但是可以进行拷贝
void test()
int t = 20;
auto f = [t](int a) return a + t; ;
auto f1 = [t](int a) return a + t; ;
f = f1;//error
auto f2(f);//ok
我们再来看看lambda表达式中C++底层是如何实现的
测试代码如下:
struct Sum
int operator()(int a, int b)
return a + b;
;
void test()
auto f = [](int a, int b) return a + b; ;
int sum = f(10, 20);
Sum s;
s(10, 20);
我们来看看执行f时的汇编代码和创建Sum对象进行的括号运算符重载的汇编代码。我们可以发现其实lambda底层就是通过伪函数来实现的
以上是关于C++ lambda表达式的主要内容,如果未能解决你的问题,请参考以下文章