什么是Lambda函数 What is Lambda Function
[capture-list](parameters) -> return_type {
// function body
};
capture-list: A list of variables from the surrounding scope that the lambda function can access.
parameters: The list of input parameters, just like in a regular function. Optional.
return_type: The type of the value that the lambda function will return. This part is optional, and the compiler can deduce it in many cases.
function body: The code that defines the operation of the lambda function.
[]内的是捕获内容,参数的()是可以省略的,return_type表示返回类型。
Lambda捕获列表 Capture-List
其余待补充
捕获类型如下:
[]:默认不捕获任何变量;
[=]:默认以复制捕获所有变量;
[&]:默认以引用捕获所有变量;
[x]:仅以复制捕获x,其它变量不捕获;
[x...]:以包展开方式复制捕获参数包变量;
[&x]:仅以引用捕获x,其它变量不捕获;
[&x...]:以包展开方式引用捕获参数包变量;
[=, &x]:默认以复制捕获所有变量,但是x是例外,通过引用捕获;
[&, x]:默认以引用捕获所有变量,但是x是例外,通过复制捕获;
[this]:通过引用捕获当前对象(其实是复制指针);
[*this]:通过复制方式捕获当前对象;
捕获和参数的区别 The difference between capture and parameters
英文知识:arguments是实参,parameters是形参。
So the caputured variables will become members of the class and thus will be reusable and the parameters will be the arguments of the operator. The captured values stay with the lambda object while the function arguments exist only for the call.
捕获的变量将成为Lambda函数的成员,因此它是可以复用的。捕获值将始终与lamdba对象一起存在,而参数仅在被调用时存在。
例子:来源于CSDN
int main()
{
int x = 8;
auto t = [x](int i){
if ( i % x == 0 )
{
std::cout << "value is " << i << std::endl;
}
};
auto t2 = [](int i, int x){
if ( i % x == 0 )
{
std::cout << "value is " << i << std::endl;
}
};
for(int j = 1; j< 100; j++)
{
t(j);
t2(j, x);
}
}
表达式t使用了捕获,而表达式t2没有使用捕获,从代码作用和量来看,它们其实区别不大,但有一点,对于表达式t,x的值只复制了一次,而对于t2表达式,每次调用都要生成一个临时变量来存放x的值,这其实是多了时间和空间的开销。