有两种使用 lambda 函数变量的方法:
std::function<int(int, int)> x1 = [=](int a, int b) -> int{return a + b;};
//usage
void set(std::function<int(int, int)> x);
std::function<int(int, int)> get();
和:
std::function<int(int, int)>* x2 = new std::function<int(int, int)>([=](int a, int b) -> int{return a + b;});
//usage
void set(std::function<int(int, int)>* x);
std::function<int(int, int)>* get();
我想知道有什么区别,因为我不知道 lambda 函数数据是如何存储的。
我想知道在性能、内存使用方面的最佳方式以及将 lambda 函数作为参数传递或返回 lambda 函数的最佳方式。
如果 lambda 函数对象的大小大于 4 或避免错误,我更喜欢使用指针(如果在我执行归因时执行了某种复制构造函数,或者在我不想要时执行了某种析构函数) .
我应该如何声明 lambda 函数变量?
编辑
我想避免复制和移动,我想再次继续使用相同的功能。
我应该如何改变这个例子?
int call1(std::function<int(int, int)> f){
return f(1, 2);
}
int call2(std::function<int(int, int)> f){
return f(4, 3);
}
std::function<int(int, int)>& recv(int s){
return [=](int a, int b) -> int{return a*b + s;};
}
int main(){
std::function<int(int, int)> f1, f2;
f1 = [=](int a, int b) -> int{return a + b;};
f2 = recv(10);
call1(f1);
call2(f1);
call1(f2);
call2(f2);
}
我无法在函数 recv 中返回引用:
warning: returning reference to temporary
这是一个好的解决方案吗?
int call1(std::function<int(int, int)>* f){
return (*f)(1, 2);
}
int call2(std::function<int(int, int)>* f){
return (*f)(4, 3);
}
std::function<int(int, int)>* recv(int s){
return new std::function<int(int, int)>([=](int a, int b) -> int{return a*b + s;});
}
int main(){
std::function<int(int, int)> f1 = [=](int a, int b) -> int{return a + b;};
std::function<int(int, int)> *f2 = recv(10);
call1(&f1);
call2(&f1);
call1(f2);
call2(f2);
delete f2;
}
编辑(结论)
lambda 函数对象就像是类实例的任何对象。分配、论据和归属的规则是相同的。