CPP琐记 03

杂记,后面会补充

lambda
[捕获列表] (参数列表) -> 返回值 {函数体}

如果lambda会生成一个匿名函数的话,并不难理解工作原理,但如果捕获列表中使用了一个局部变量会怎么样呢?

    auto f = [] {return 45;};
    std::cout << f() << std::endl;

    std::cout << [f](int i){return f() + i;}(1) << std::endl;

    int i = 88;
    std::cout << [f, i](){return f() + i;}() << std::endl;

我们看最后一句
由于f是另外一个匿名函数,因此会被翻译成正常的函数call

int __thiscall main::_unnamed_tag_::operator()_1(_DWORD *this)
{
  return this[1] + main::_unnamed_tag_::operator()(this);
}

通过ida反编译可见,i已经被提到了类成员变量上

彩蛋

    auto check = std::bind([](const std::string &s, int len){
        return s.length() > len;
        }, std::placeholders::_1, 6);
    auto f5 = check("123");
    auto f6 = check("123", 2);

我把我自己整乐了

发表评论

电子邮件地址不会被公开。 必填项已用*标注