Переменные лямбда-функции в C++11

Есть два способа использования переменной лямбда-функции:

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;
}

РЕДАКТИРОВАТЬ (Заключение)

Объект лямбда-функции подобен любому объекту, являющемуся экземпляром класса. Правила выделения, аргументации и атрибуции одинаковы.

7
задан Squall 12 June 2012 в 21:05
поделиться