lambda 表达式,又被称为 lambda 函数或者 lambda 匿名函数。
lambda 匿名函数的定义:
C++
[capture list] (parameter list) -> return type
{
function body;
};
其中:
C++
[] // 没有定义任何变量。使用未定义变量会引发错误。
[x, &y] // x以传值方式传入(默认),y以引用方式传入。
[&] // 任何被使用到的外部变量都隐式地以引用方式加以引用。
[=] // 任何被使用到的外部变量都隐式地以传值方式加以引用。
[&, x] // x显式地以传值方式加以引用。其余变量以引用方式加以引用。
[=, &z] // z显式地以引用方式加以引用。其余变量以传值方式加以引用。
比如下面以引用的方式调用 a:
C++
int main()
{
int a = 10;
auto f = [&a](int x)-> int {
a = 20;
return a + x;
};
cout<<a<<endl; // 10
cout<<f(10)<<endl; // 30
cout<<a<<endl; // 20
return 0;
}
举例:
C++
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int arr[4] = {4, 2, 3, 1};
//对 a 数组中的元素进行升序排序
sort(arr, arr + 4, [=](int x, int y) -> bool{ return x < y; } );
auto f = [&](int x)-> int {
return arr[0] + x;
}
for(int n : arr){
cout << n << " ";
}
return 0;
}
C++
#include <iostream>
using namespace std;
int main()
{
size_t t = 9;
auto f = [t]() mutable{
t++;
return t;
};
cout << f() << endl; // 10
t = 100;
cout << f() << endl; // 11
cout << "t:" << t << endl; // t: 100
return 0;
}
C++
#include <iostream>
#include <cstring>
#include <functional>
auto GetFunc(){
std::string s = "112234234234";
return [&](){ std::cout << s << std::endl; };
}
int main(int, char*[]){
auto func = GetFunc();
func();
return 0;
}
返回值和参数均使用泛型,编译器会根据实际进行类型推导。
C++
auto lambda = [](auto x, auto y) {return x + y;}
lambda(1, 2);
lambda(1.0, 2.0);
允许在 lambda 捕获列表中对变量进行表达式赋值,并且支持定义新的变量并进行初始化。
C++
auto lambda = [value = 1] {return value;}
C++
int y = 32;
auto answer = [y]() constexpr
{
int x = 10;
return y + x;
};
constexpr int Increment(int n)
{
return [n] { return n + 1; }();
}
阅读量:2011
点赞量:0
收藏量:0