嵌套 lambda 导致编译器耗尽堆

joh*_*ohn 5 c++ c++11

我正在编写一些代码,将 lambda 函数传递给一组递归函数。其中一些 lambda 函数嵌套在其他 lambda 函数内。我认为我正在编写有效的代码,但出现错误fatal error C1060: compiler is out of heap space

这是代码的精简版本

struct Null
{
    template <typename SK>
    static void match(SK sk)
    {
    }
};

template <typename T>
struct Repetition
{
    template <typename SK>
    static void match(SK sk)
    {  // <--------------------------------- error message points to this line
        T::match([]() { match([]() {}); });
    }
};

int main()
{
    using Test = Repetition<Null>;
    Test::match([](){});
}
Run Code Online (Sandbox Code Playgroud)

现在这个最小版本没有多大意义,但它有相同的编译器错误。我已经指出了上面错误的行。

我的问题是,这是编译器错误/限制还是我的代码在某种程度上无效?

编译器是 Visual Studio 2022 编译 C++20。

谢谢

And*_*dyG 6

根据[expr.prim.lambda.closure]

lambda 表达式的类型(也是闭包对象的类型)是唯一的、未命名的非联合类类型

要实例化Repetition::match,编译器必须实例化Null::match,这需要实例化Repetition::match...等等。编译器每次递归时,[]() {}都被视为一个全新的类型,无穷无尽。

要让它停止递归,请将您的调用替换为:

T::match(sk);
Run Code Online (Sandbox Code Playgroud)