Добавление двух лямбда-функций в С++

Я пытаюсь добавить две лямбда-функции c++. Я имею в виду следующее:

Предположим, у вас есть две функции f и g с одним или несколькими аргументами, скажем, f(x,y) и g(x,y). Я хочу добавить их обоих в новую функцию h следующим образом:

h = f + g

И оценка должна работать так:

h(x,y) = f(x,y) + g(x,y)

Пока что я попробовал следующий код, но он не работает. "Cin" в конце как раз для предотвращения автоматического закрытия консоли.

#include <iostream>
#include <functional>

using namespace std;


function<int (int,int)> add(function<int(int, int)> g, function<int(int, int)> f)
{
    return [&](int x, int y)->int{return g(x, y) + f(x, y); };
}


int main()
{
    int i = 0;

    function<int (int,int)> sum = [](int x, int y)->int { return x + y; };
    function<int (int,int)> mul = [](int x, int y)->int { return x * y; };
    cout << sum(1, 2) << endl;
    cout << mul(3, 4) << endl;

    function<int(int, int)> s = add(sum, mul);

    cout << s(2, 3) << endl;

    cin >> i;
}

Код компилируется, но он перестает работать, когда я пытаюсь оценить s (2,3). Он просто говорит, что программа перестала работать, и я должен закрыть ее. Я использую Visual Studio 2013.

Кто-нибудь знает, как это сделать правильно? Или вы знаете какие-нибудь библиотеки, которые могут сделать это из коробки?

Ответ 1

Это тонко.

function<int (int,int)> add(function<int(int, int)> g, function<int(int, int)> f)
{
    return [&](int x, int y)->int{return g(x, y) + f(x, y); };
         // ^-- This here
}

Вы захватываете g и f по ссылке и сохраняете эти ссылки в возвращаемой вами std::function. Но это ссылки на локальные переменные функции, поэтому они свисают в секунду, когда вы возвращаете. Поэтому ваш код просто имеет неопределенное поведение.

Простым решением было бы захватить по значению [=].