lambda 表达式的一般形式:
[capture list] (parameter list) -> return type{function body};
其中, capture list (捕获列表) 是一个 lambda 所在函数中定义的局部变量的列表 (通常为空);
return type,parameter list 和 function body 与任何普通函数一样分别表示返回类型, 参数列表和函数体.
但是与普通函数不同, lambda 必须使用尾置返回来指定返回类型.
此外, 我可以忽略参数列表和返回类型, 但必须永远包含捕获列表和函数体:
auto f = [] { return 42 }
此例中, 我们定义了一个可调用的对象 f, 它没有参数, 返回值为 42;
调用方式: 与普通函数一致;
cout <<f() << endl;
在忽略了返回值类型的情况下, lambda 根据函数体中代码推断出返回值类型; 如果函数体只是一个 return 语句, 则返回类型从返回的表达式的类型推断而来. 否则, 返回类型为 void.
使用条件:
- "引用捕获有时是必要的. 例如, 我们可能希望 biggies 函数接受一个 ostream 的引用, 用来输出数据, 并接受一个字符作为分隔符:"
- void biggies(vector<string> &words,
- vector<string> ::size_type sz,
- ostream &os = cout, char c = ' ')
- {
- // 打印 count 的语句改为打印到 os
- for_each(words.begin(), words.end(),
- [&os, c] (const string &s) { os << s << c; });
- }
我们不能拷贝 ostream 对象, 因此捕获 os 的唯一方法就是捕获其引用 (或指向 os 的指针).
注意: 当引用方式捕获一个变量时, 必须保证 lambda 执行时变量是存在的.
一般来说, 我们应该尽量减少捕获的数据量, 来避免潜在的捕获导致的问题. 而且, 如果可能的话, 应该避免捕获指针或引用.
来源: http://www.bubuko.com/infodetail-3157133.html