gpt4 book ai didi

c++ - 无限模板实例化

转载 作者:行者123 更新时间:2023-11-30 05:17:51 24 4
gpt4 key购买 nike

这是我简化的测试代码:

struct Test {
Test() { run(0); }

template<class T>
static auto run(T&&, bool stop = false) -> void { if (!stop) _run<T>(); }
template<class R>
static auto _run() -> void { [] () { run([] () {}, true); }(); }
};

当我用 GCC 和 clang 编译这段代码时,它给出了编译错误:

/media/data/caca3d/src/b0util/test/tst_promise.cpp:30: error: template instantiation depth exceeds maximum of 900 (use -ftemplate-depth= to increase the maximum)
static auto _run() -> void { [] () { run([] () {}, true); }(); }
~~~^~~~~~~~~~~~~~~~

我不明白为什么这段代码会导致无限的模板实例化。

仅供引用,如果我删除 template<class R>_run()函数,错误消失了。

我在尝试使用 lambda 函数进行一些惰性计算时发现了这个错误,因此我无法删除 lambda 中的间接调用。我该如何解决这个问题?

最佳答案

让我们仔细看看发生了什么。第一个函数显式调用了 _run() 的模板化版本,我想您对这部分没有疑问。

template<class T>
static auto run(T&&, bool stop = false) -> void { if (!stop) _run<T>(); }

第二个更有趣。看起来它只会被实例化一次(因为你只是用 lambda 调用一次 run()),但根据标准,每个 lambda 都有自己独特的类型,所以每次_run() 被实例化,它将强制创建新版本的 run() (因为 T 是从函数的参数类型推导出来的) , 创建一个无限循环。

template<class R>
static auto _run() -> void { [] () { run([] () {}, true); }(); }

在这个特定示例中解决此问题的最简单方法是使 run() 获取特定(可能是模板参数相关)的 std::function ) 匹配你的 lambda 的类型。

关于c++ - 无限模板实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42018090/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com