代码之家  ›  专栏  ›  技术社区  ›  kadina

递归std::函数正在抛出错误

c++
  •  0
  • kadina  · 技术社区  · 5 年前

    #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没有完全定义吗?谁能告诉我怎么解决这个问题吗。

    1 回复  |  直到 5 年前
        1
  •  2
  •   selbie    5 年前

    更新

    这条线看起来可疑:

    return y + x(--y);
    

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

    return y + x(y-1);
    

    分开你的声明 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 会被打印出来的。