C 为什么我的模板扩展导致编译器堆栈溢出

C++ why my template expansion lead to compiler stack overflow?

本文关键字:编译器 堆栈 栈溢出 扩展 为什么 我的      更新时间:2023-10-16

i正在尝试模板元编程并编写一个函数来计算基础^re re of 3^2 = 9

template<int N>
int Tpow(int base){return N==0?1:base*Tpow<N-1>(base);}
int main()
{
    int r3=Tpow<3>(2);
    return 0;
}

只有几行,但它崩溃了GCC和Clang。我在哪里弄错了?谢谢。

template<>
int Tpow<0>(int base){return 1;}

现在有了这个,您也可以像这样优化原始模板:

template<int N>
int Tpow(int base){return base*Tpow<N-1>(base);}

因为您知道自己处理n等于0的情况。

说明:您的编译器基本上是这样做的:它看到

int r3=Tpow<3>(2);

并将3个函数作为模板变量,例如so

int Tpow_3(int base){return 3==0?1:base*Tpow<3-1>(base);}

,然后需要为2作为模板变量制作函数,例如so

int Tpow_2(int base){return 2==0?1:base*Tpow<2-1>(base);}

这还在继续,因为编译器还不关心您的0==0?...

编译器必须编译整个函数主体:它不能依靠三元条件来仅编译一侧。因此,递归上没有块。

(使用C 11的constexpr也无济于事)。

要解决这个问题,您需要 posepitize n = 0案例的功能。