lambda表达式是一种匿名函数,在Java,C#等高级语言中早有实现。在C++11中把lambda表达式纳入了标准中,lambda表达式是C++的一种可调用对象(callable object),可以像调用普通函数一样使用。对于那种只在一两个地方使用的简单操作,lambda表达式非常有用,如果我们需要在很多地方使用相同的操作,则使用普通函数更好。同样的,如果一个操作包含很多操作,也需要使用函数。
我们可以将lambda表达式理解为一个匿名的内联函数,一个完整的lambda表达式的结构如下:
[capture list] (parameter list) -> return type {function body}
capture list为捕获列表,是一个lambda所在函数中定义的局部变量的列表,通常为空,其余的则和普通函数一样。与普通函数唯一有点不一样的是lambda使用的是尾置返回。在一个lambda函数中,必须包含捕获列表和函数体,参数列表和返回类型则可以省略。比如:
auto f = [] {return 0;}
std::cout << f() << std::endl
和普通函数一样,我们也可以向一个lambda表达式传递参数,唯一不同的就是lambda表达式中的参数不能有默认参数,比如:
auto f = []{std::string& str} {return str.length();}
上面的lambda表达式函数体都只包含一个return语句,如果函数体包含出return以外其他语句,则默认返回类型为void,比如:
auto f = []{int a} {if(a > 0) return a;else return -a;}
int value = f(-20);
编译器会报错,指出返回值类型错误,正确的方式应该是指定返回类型
auto f = []{int a} -> int {if(a > 0) return a;else return -a;}
int value = f(-20);