如何定义和使用一个 Lambda 表达式
什么是Lambda?
C++11引入lambda,是一份功能定义式,可以被定义于语句(statement)或表达式(expression)内部。
完整的lambda形式如下:
[= ,&y](arg_type)->return_type
{
statement
};
//注:arg_type表示 参数类型 如:int double string
// return_type 表示返回类型
// statement 表示语句
接下来针对上例中 [ ] ( ) -> { }的作用和使用,来详细介绍
1. [ ] 外部变量的使用,可选符号 = &
lambda函数引用函数体外变量在 [ ] 方括号中实现
主要有以下几种形式:
[ ] 当为空时,表示外部变量,函数体内不能使用
[=] by value 只读数据,不能修改
[&] by reference 可以修改数据
[x,&y] 指定lambda函数内能使用的变量 x by value,y by reference
[=,&y] 指定y by reference 传进来,其它以by value传进来
[&x,&y,&z,…] 指定任意个外部变量 by reference 传进来
注释: 以上x,y是外部变量
注:以下常见错误
- [&y,=] //error &y指y by reference方式供lambda使用,而 = 又表示所有外部变量以by value方式传递,矛盾表达,这是最容易犯的错误,正确表达为 [=,&y]。
- [=x] //error =后不需接x 这个与&x不同,要谨记。
2.( ) lambda的参数
lambda函数的参数传递在 ( ) 小括号中实现
2.1 有参时,lambda定义; 例:
[ ](char c){statement};
2.2 无参情况有以下3种情况;例:
[ ](){statement}; //形式1
[ ]{statement}; //形式2
[ ](void){statement}; //形式3
3.-> lambda返回值
有返回值时; 例:
[ ]()->int/double/...{...};
无返回值时 ;例:
[ ](){...}; //形式1
[ ]()->void{...}; //形式2
4.Lambda直接使用(新增2019.3.7)
方法1:
std::cout<<[](int a)-> int{return a; }(2);//在其后加上()可直接使用(解释:函数当然要有())
方法2:
auto f = [](int a)-> int{return a; };
std::cout<<f(2);
4.完整示例
示例:
#include <iostream>
#include <string>
int main()
{
int x = 1;
int y = 1;
int z = 1;
auto f = [x,&y](const std::string&str)->int{
std::cout << "执行lambda" << std::endl;
std::cout << str << std::endl;
// x++; //by value不可修改
// y=z+y // error ,z不能供使用
y=x+y; //by reference 可修改
return 1;
};
std::cout << "还未调用lambda" << std::endl << std::endl;
std::cout << f("你好")<<std::endl;
std::cin.get();
解释:
1.上例中 x以by value 供lambda使用,不能改变x的值,y by reference供lambda使用,可以修改y的值,z不能被lambda使用 .
2.返回值为int型
3 参数为const string型,lambda不能修改str 值