C++11 标准库function类型与lamda语法

以前只在XXX语言中,看到过lamda语法,现在它出现在了C++中...;以前都是用map<char, function pointer>来管理函数,现在有了function类型。

故事从标准库function类型开始讲起...

标准库function类型

它是一个模板,当创建具体function类型时,必须在尖括号中提供额外的信息,比如function<int(int, int)>,它声明了一个function类型,接受两个int参数,返回一个int值。具体使用如下:

function<int(int, int)> mul = [] (int a, int b) { return a + b };//lamda
cout << mul(1,2) << endl;

新出的lamda语法

lamda语法的完整的格式应该这么写:

[capture list] (parameter list) -> return type { function body }

其中,(parameter list) -> return type也就是中间部分是可以省略的。另外,还有几点需要说明: 1. [capture list] 捕获列表:也就是lamda可以直接使用所在函数的局部变量,甚至还可以引用捕获; 2. (parameter list) 传参:是lamda函数本身接受的参数。(该部分可以省略,那就是无参void); 3. -> return type 返回类型:如果被省略,那么会根据return值,自动推导,但是只有在函数体中只有仅一条return语句,无其他语句的情况下,才会推导,否则总是返回void; 4. { function body } 函数体: 一般情况下,全部写在一条return语句中,此时返回类型可以省略。


References: [1] Stanley B. Lippman《C++ Primer(第5版)》 [2] 祁宇《深入C++11代码优化与工程级应用》 [3] Scott Meyers《Effective Modern C++》