lambda

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);
原文地址:https://www.cnblogs.com/Codroc/p/13998419.html