在C+中添加两个lambda函数+; 我试图添加两个C++ lambda函数。我的意思是:

在C+中添加两个lambda函数+; 我试图添加两个C++ lambda函数。我的意思是:,c++,function,lambda,visual-studio-2013,functional-programming,C++,Function,Lambda,Visual Studio 2013,Functional Programming,假设有两个函数f和g,每个函数都有一个或多个参数,比如f(x,y)和g(x,y)。我想将它们添加到一个新函数h中,如下所示: h = f + g h(x,y) = f(x,y) + g(x,y) 评估工作应该是这样的: h = f + g h(x,y) = f(x,y) + g(x,y) 到目前为止,我已经尝试了以下代码,但它不起作用。末端的“cin”正好在那里,以防止控制台自动关闭 #include <iostream> #include <functional>

假设有两个函数
f
g
,每个函数都有一个或多个参数,比如
f(x,y)
g(x,y)
。我想将它们添加到一个新函数h中,如下所示:

h = f + g
h(x,y) = f(x,y) + g(x,y)
评估工作应该是这样的:

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;
}
#包括
#包括
使用名称空间std;
功能添加(功能g、功能f)
{
return[&](intx,inty)->int{returng(x,y)+f(x,y);};
}
int main()
{
int i=0;
函数和=[](int x,int y)->int{return x+y;};
函数mul=[](intx,inty)->int{return x*y;};
这很微妙

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)
{
return[&](intx,inty)->int{returng(x,y)+f(x,y);};
//^--这里是
}
您通过引用捕获
g
f
,并将这些引用存储在您返回的
std::function
中。但这些是对函数局部变量的引用,因此它们在您返回时会挂起。因此,您的代码只是具有未定义的行为


一个简单的修复方法是通过值
[=]捕获

注意:
std::function
不是lambda,它用性能成本包装lambda。相关:我个人总是指定我捕获的数字:这可能会防止您犯一些错误。对我来说,这与强键入相同。如果函数参数声明为引用,则通过引用捕获会正确工作吗?例如。g、
add(函数&g、函数&f)
?@ApproachingDarknessFish-在即时调用上下文中正确。这些引用仍然可以挂起。由于这些不是常量左值引用,现在传入lambda变得更加麻烦。我不喜欢绝对语句,但对于长寿命的
std::function
,按值捕获是明智的选择做错事。