lambdas
类似于一种 inline function,能被当作是一种参数或是一种局部对象。
看到中括号开头的那就是 lambda 啦~~~
[] {
std::cout << "hello lambda!" << std::endl;
};
[] {
std::cout << "hello lambda!" << std::endl;
} (); //prints "hello lambda!"
//or pass it to objects to get called:
auto l = [] {
std::cout << "hello lambda!" << std::endl;
};
···
l(); //prints "hello lambda!"
[] 是 lambda introducer,看到这个中括号就表明是个 lambda 表达式。
[···] (···) mutable throwSpec -> retType {···}
int id = 0;
auto f = [id] () mutable { // 此处的 mutable 表示 [] 中的内容即 id 可变; 如果不加 mutable 关键字,id 是不能 ++ 的!!
std::cout << "id:" << id << std::endl;
++id; //OK
}
id = 42;
f();
f();
f();
std::cout << id << std::endl;
得到结果:
id: 0
id: 1
id: 2
42
怎么理解呢?????
lambda 类型可以理解成是一种匿名函数对象:
class Function {
private:
int id; //copy of outside id
public:
void operator()() {
std::cout << "id:" << id << std::endl;
++id; //OK
}
};
Function f;
这样就不难理解上述 lambda 对象 f 的行为了。在构造 lambda 表达式之前 id = 0, 那么此时构造 lambda 表达式,相当于构造了一个 Function 类,类中的 member data 就是通过 [] 传进来的值。此时 f.id = 0,所以之后程序执行到 id = 42,并不会影响到 f 中的 member data!!!
当 pass by reference 时又会发生什么呢?
int id = 0;
auto f = [&id] (int param) {
std::cout << "id:" << id << std::endl;
++id; ++param;//OK
}
id = 42;
f(7);
f(7);
f(7);
std::cout << id << std::endl;
得到结果:
id: 42
id: 43
id: 44
45
可以说这个结果是在意料之中的!
看一个编译器为 lambda 产生的代码:
int tobefound = 5;
auto l = [tobefound] (int val) {return val == tobefound;};
// 编译器对 lambda 表达式解释成如下:
//=======================================================
class UnNamedLocalFunction
{
int localVar;
public:
UnNamedLocalFunction(int var) : localVal(var) {}
bool operator()(int val)
{ return val == tobefound; }
}
UnNamedLocalFunction l(tobefound);
//=======================================================
bool b1 = l(5);