在 C++ 中添加两个 lambda 函数

Posted

技术标签:

【中文标题】在 C++ 中添加两个 lambda 函数【英文标题】:Adding two lambda-functions in C++ 【发布时间】:2019-10-17 16:13:42 【问题描述】:

我正在尝试添加两个 c++ lambda 函数。我的意思是:

假设您有两个函数fg,每个函数都有一个或多个参数,比如说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)->intreturn 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。

有人知道如何正确执行此操作吗?或者您知道任何可以开箱即用的库吗?

【问题讨论】:

c++ - C++11 Lambda closure involving a stack variable by reference that leaves scope is allowed but getting undefined behavior? - Stack Overflow 注意:std::function 不是 lambda,它以性能成本包装了 lambda。 相关:***.com/q/6441218 【参考方案1】:

很微妙。

function<int (int,int)> add(function<int(int, int)> g, function<int(int, int)> f)

    return [&](int x, int y)->intreturn g(x, y) + f(x, y); ;
         // ^-- This here

您通过引用捕获gf,并将这些引用存储在您返回的std::function 中。但是这些是对函数局部变量的引用,所以它们会在您返回的第二个中悬空。因此,您的代码只是具有未定义的行为。

一个简单的解决方法是按值捕获[=]

【讨论】:

我个人总是指定我捕获的数字:它可以防止你犯一些错误。对我来说,它与强类型相同。 如果函数参数被声明为引用,通过引用捕获是否可以正常工作?例如add(function&lt;&gt; &amp;g, function&lt;&gt; &amp;f)? @ApproachingDarknessFish - 在直接调用上下文中正确。这些参考仍然可以悬空。而且由于这些不是 const 左值引用,现在传入 lambda 变得更加麻烦。我不喜欢绝对陈述,但对于长寿的std::function,按值捕获是明智的默认做法。

以上是关于在 C++ 中添加两个 lambda 函数的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 中定义匿名函数?

C++——Lambda表达式

通过在两个现有列上使用 lambda 函数在 Panda 中创建一个新列

在单个AWS Lambda中使用两个python函数boto3

如何设置 lambda 函数以一起使用两个触发器

aws - 我应该创建两个 lambda 函数来处理 dynamodb 查询和非查询用例吗?