杂记,后面会补充
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);
我把我自己整乐了