C 为什么我的模板扩展导致编译器堆栈溢出
C++ why my template expansion lead to compiler stack overflow?
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案例的功能。
相关文章:
- C/C++编译器通常会删除重复的库吗
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- Win32编译器选项和内存分配
- MSVC多行宏编译器错误
- C 为什么我的模板扩展导致编译器堆栈溢出
- 编译器可以优化从堆到堆栈的分配吗
- C++ 编译器是否将这种形式的"new"视为堆栈内存?
- 动态堆栈、编译时出错、dev编译器和g++
- MSVS 2010 C++编译器和堆栈对齐问题
- 编译器如何管理运行时堆栈
- g++编译器提示在堆栈上进行分配
- 编译器是否在将std::字符串传递给C++中的函数时将其复制到堆栈中
- 为什么在非指针堆栈分配变量上调用 delete 时C++不给出编译器错误?
- 哪些g++标志会使堆栈上运行时大小的数组导致编译器错误
- 编译器如何为编译器生成的临时函数确定所需的堆栈大小
- 强制c++编译器对一个对象的所有堆栈实例发出警告
- 某个程序的堆栈内存有多大,是否有任何编译器标志可以设置它
- 如果局部堆栈变量是未定义的行为,为什么编译器会发出有关返回对局部堆栈变量的引用的警告
- 编译器构造-如何在C++中发生堆栈下溢
- 编译器如何在堆栈上分配内存