LZ遇到的SVO代码为:
initialization.cpp
for_each(new_features.begin(), new_features.end(), [&](Feature* ftr){
px_vec.push_back(cv::Point2f(ftr->px[0], ftr->px[1]));
f_vec.push_back(ftr->f);
delete ftr;
});
总结:输入参数Feature* ftr为特征指针ftr,使用引用捕获所有外部变量。最后的删除ftr是为什么???
Lambda表达式的使用
Lambda表达式是一种内嵌的匿名函数,是没有名字的临时函数,所以暂时命名为λ。其作用和 inline内联函数相似。
[capture] (parameters) mutable -> returntype { statement }
capture:捕捉列表由0个或多个“捕捉项”组成,并以逗号“,”分隔。表示以什么方式捕捉上下文变量
paremeters:参数列表。如果没有的话可以()或者省略
mutable:关键字,可更改的。默认情况下,返回Lambda返回const。
returntype:函数返回类型。
{statement}:函数体。
捕捉列表 [] 解读
捕捉列表 [] 可以是由0个或多个“捕捉项”组成,并以逗号“,”分隔
Lambda表达式通过在最前面的方括号[]来明确指明其内部可以访问的外部变量,这一过程也称过Lambda表达式“捕获”了外部变量。
1).[]不捕获任何变量。注意:没有输入参数时没有可用的变量。
2).[&]捕获外部作用域中所有变量,按引用捕获
3).[=]捕获外部作用域中所有变量,按值捕获。
4).[=,&foo]按值捕获外部作用域中所有变量,并按引用捕获foo变量。
5).[bar]按值捕获bar变量,同时不捕获其他变量。
6).[this]表示值传递方式捕捉当前的this指针,让lambda表达式拥有和当前类成员函数同样的访问权限。如果已经使用了&或者=,就默认添加此选项。捕获this的目的是可以在lamda中使用当前类的成员函数和成员变量。但是不能用形参。
#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;
int main()
{
int a = 1,b =2, c =3;
// 1.没有形参
auto retVal = [=,&a,&b]()
{
printf("inner c[%d]\n",c);
a = 10;
b = 20;
return a+b;
};
// 2.有形参
auto sum = [](int a,int b) ->int{return a + b;};
printf("sum1[%d]\n",retVal()); // 调用函数时后面加()
printf("sum2[%d]\n",sum(1,2));
printf("a[%d] b[%d] c[%d]\n",a,b,c);
return 0;
}
打印结果:
inner c[3]
sum1[30]
sum2[3]
a[10] b[20] c[3]
[=,&a,&b] 捕捉列表有3项
class A
{
public:
int i_ = 0;
void func(int x,int y){
auto x1 = [] { return i_; }; //error,没有捕获外部变量
auto x2 = [=] { return i_ + x + y; }; //OK
auto x3 = [&] { return i_ + x + y; }; //OK
auto x4 = [this] { return i_; }; //OK
auto x5 = [this] { return i_ + x + y; }; //error,没有捕获x,y
auto x6 = [this, x, y] { return i_ + x + y; }; //OK
auto x7 = [this] { return i_++; }; //OK
};
,引用传递方式捕捉a、b,值传递方式捕捉c。
例子:
参考:
https://www.cnblogs.com/DswCnblog/p/5629165.html