Есть два способа использования переменной лямбда-функции:
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();
Я хотел бы знать, в чем различия, потому что я не знаю, как хранятся данные лямбда-функции.
Я хотел бы знать лучший способ с точки зрения производительности, использования памяти и лучший способ передать лямбда-функцию в качестве аргумента или вернуть лямбда-функцию.
Я бы предпочел использовать указатели, если размер объекта лямбда-функции больше 4 или избежать ошибок (, если какой-то конструктор копирования выполняется, когда я делаю атрибуцию, или если какой-то деструктор выполняется, когда я этого не делаю. хочу ).
Как объявлять переменные лямбда-функции?
РЕДАКТИРОВАТЬ
Я хочу избежать копирования и перемещения, я хочу снова использовать ту же функцию.
Как изменить этот пример?
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;
}
РЕДАКТИРОВАТЬ (Заключение)
Объект лямбда-функции подобен любому объекту, являющемуся экземпляром класса. Правила выделения, аргументации и атрибуции одинаковы.