C++中lambda表达式的通用语法
lambda 表达式总是以方括号打头,并可接受多个状态变量,为此可在捕获列表( […])中指定这
些状态变量,并用逗号分隔:
[stateVar1, stateVar2](Type& param) { // lambda code here; }
如果要在 lambda 表达式中修改这些状态变量,可添加关键字 multable:
[stateVar1, stateVar2](Type& param) mutable { // lambda code here; }
这样,便可在 lambda 表达式中修改捕获列表( [])中指定的变量,但离开 lambda 表达式后,这些
修改将无效。要确保在 lambda 表达式内部对状态变量的修改在其外部也有效,应按引用传递它们:
[&stateVar1, &stateVar2](Type& param) { // lambda code here; }
lambda 表达式还可接受多个输入参数,为此可用逗号分隔它们:
[stateVar1, stateVar2](Type1& var1, Type2& var2) { // lambda code here; }
如果要向编译器明确地指定返回类型,可使用->,如下所示:
[stateVar1, stateVar2](Type1 var1, Type2 var2) -> ReturnType
{ return (value or expression ); }
最后,复合语句( {})可包含多条用分号分隔的语句,如下所示:
[stateVar1, stateVar2](Type1 var1, Type2 var2) -> ReturnType
{
Statement 1;
Statement 2;
return (value or expression);
}
如果 lambda 表达式包含多行代码,您必须显式地指定返回类型。
本章后面的程序清单 22.5 演示了一个跨越多行并指定了返回类型的 lambda 表达式。
总之, lambda 表达式更简洁,从功能上说,完全可替代下面这样的函数对象:
template<typename Type1, typename Type2>
struct IsNowTooLong
{
// State variables
Type1 var1;
Type2 var2;
// Constructor
IsNowTooLong(const Type1& in1, Type2& in2): var1(in1), var2(in2) {};
// the actual purpose
ReturnType operator()
{
Statement 1;
Statement 2;
return (value or expression);
}
};