【问题标题】:Recursive std::function is throwing errors递归 std::function 抛出错误
【发布时间】:2021-02-15 01:40:14
【问题描述】:

我试图递归地使用 lambda 函数,如下所示。

#include <iostream>
#include <functional>

using namespace std;

int main()
{
    std::function<int(int)> x = [](int y) -> int {
        if(y == 0) {
            return 0;
        } else {
            return y + x(--y);
        }
    };
    
    cout << x(3) << endl;
}

但它会抛出错误。

main.cpp: In lambda function:
main.cpp:20:24: error: ‘x’ is not captured
             return y + x(--y);
                        ^
main.cpp:16:34: note: the lambda has no capture-default
     std::function<int(int)> x = [](int y) -> int {
                                  ^
main.cpp:16:29: note: ‘std::function x’ declared here
     std::function<int(int)> x = [](int y) -> int {
                             ^

这是因为编译器到达 x(--y) 时 x 没有完全定义而引发错误吗?谁能告诉我如何解决这个问题。

【问题讨论】:

  • 您是否尝试按照错误消息中的说明捕获x[&amp;x](int y) -&gt; int { /* ... */ }
  • 我宁愿使用普通函数。您正在尝试捕获尚未声明的内容。这是它自己的 lambda 函数。
  • 请参阅此答案的“捕获变量”部分stackoverflow.com/a/7627218/9716597
  • 当我尝试捕获为 &x 时,它给出的输出为 '3'。但它的输出应该是 6 (3 + 2 + 1)。
  • @kadina 将x(--y) 更改为x(y-1) 以避免未排序的点问题。

标签: c++


【解决方案1】:

更新

这条线看起来很可疑:

return y + x(--y);

您正在递减 y 并在同一个表达式中对其进行评估。对于这样的语句,规则在“已定义”和“未定义”之间有所不同。但我怀疑你真的想要这个:

return y + x(y-1);

x 的声明与分配分开。并通过引用捕获x

int main()
{
    std::function<int(int)> x;
    x = [&x](int y) -> int {
        if (y == 0) {
            return 0;
        }
        else {
            return y + x(y-1);
        }
    };

    cout << x(3) << endl;
}

结果是6 将被打印出来。

【讨论】:

  • 我试过这个。我仍然得到输出为 3。
  • 我正在按照stackoverflow.com/questions/14531993/… 接受的答案关注。我仍然没有得到想要的结果。
  • 哦,我明白了这个问题....将y + x(--y) 更改为y + x(y-1)
  • y + x(--y) 是未定义的行为; + 的操作数没有排序
  • “将你的 x 声明与赋值分开。”。不需要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-10
  • 2011-11-24
  • 2014-03-08
相关资源
最近更新 更多