我正在编写一些代码,将 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。
谢谢
lambda 表达式的类型(也是闭包对象的类型)是唯一的、未命名的非联合类类型
要实例化Repetition::match,编译器必须实例化Null::match,这需要实例化Repetition::match...等等。编译器每次递归时,[]() {}都被视为一个全新的类型,无穷无尽。
要让它停止递归,请将您的调用替换为:
T::match(sk);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
117 次 |
| 最近记录: |