Lambda
1. Lambda 语法
lambda是一份功能定义,可被定义与语句或表达式内部。
因此你可以拿lambda当做inline函数使用
lambda表达式形式如下
[capture list] (parameter list) -> return type { functiono body}
[capture list] (parameter list) mutable -> return type { functiono body}
lambda如何使用
#include <iostream>
using namespace std;
int main()
{
// 1、直接调用
[] {
cout << "hello lambda "
<< "\t" << 1 << endl;
}(); // 直接调用,输出:hello lambda 1
// 2、把它传递给对象,使之能被调用
auto a1 = [] {
cout << "hello lambda "
<< "\t" << 2 << endl;
};
a1(); // 通过对象调用,输出:hello lambda 2
// 3、传参
auto a2 = [](const string &s) {
cout << s
<< "\t" << 3 << endl;
};
a2("hello lambda"); // hello lambda 3
return 0;
}
[root@lwh testcpp]# ./test4.out
hello lambda 1
hello lambda 2
hello lambda 3
[root@lwh testcpp]#
2. capture(用以访问外部作用域)
在lambda的[ ]中,指明一个capture list来处理外部作用域内未被传递为实参的数据;
[=] 意味着外部作用域以by value方式传递给lambda。此时,你可以读取所有可读数据,但不能改动它们。
[&] 意味着外部作用域以by reference方式传递给lambda,此时,你对所有数据的涂写动作都合法,前提是你拥有涂写它的权力。
#include <iostream>
using namespace std;
int main()
{
int x = 0, y = 42;
auto qqq = [x, &y]() {
cout << "x: " << x << "\ty: " << y << endl;
++y; // OK
};
x = y = 77;
qqq(); // x: 0 y: 77 // 内部的x,外部的y
qqq(); // x: 0 y: 78 // 内部的x,外部的y
cout << "finally x: " << x
<< "\ty: " << y << endl;
// finally x: 77 y: 79 // 外部的x,外部的y
return 0;
}
by value 传递x;
此时内部的x是外部x的copy,且内部的x是const的,即内部不可对x进行涂写;
by reference传递y
此时内部涂写y,就是涂写外部的y
#include <iostream>
using namespace std;
int main()
{
int id = 0;
auto f = [id]() mutable {
cout << "id: " << id << endl;
++id; // OK
};
id = 42;
f(); // id: 0 // 内部的x
f(); // id: 1 // 内部的x
f(); // id: 2 // 内部的x
cout << "finally: " << id << endl; // finally: 42 // 外部的x
return 0;
}
[root@lwh testcpp]# ./test4.out
id: 0
id: 1
id: 2
finally: 42
by value 传递x;
此时内部的x是外部x的copy,且内部的x是const的,
但此时指定了mutable,此时允许涂写x;
注意,此时涂写的是内部的x,对外部的x没影响