C++ c+;中的非类型模板参数有什么可能+;为什么这个代码是不可访问的?
非类型模板参数有什么可能?标准暗示了哪些限制 例如,此代码超过模板初始化深度:C++ c+;中的非类型模板参数有什么可能+;为什么这个代码是不可访问的?,c++,templates,C++,Templates,非类型模板参数有什么可能?标准暗示了哪些限制 例如,此代码超过模板初始化深度: template<unsigned N> inline constexpr unsigned fibo_v() { if (N == 0) { return 0; } else if (N == 1 || N == 2) { return 1; } else { return fibo_v<N - 1>() + fibo_
template<unsigned N>
inline constexpr unsigned fibo_v() {
if (N == 0) {
return 0;
} else if (N == 1 || N == 2) {
return 1;
} else {
return fibo_v<N - 1>() + fibo_v<N - 2>();
}
}
模板
内联constexpr无符号fibo_v(){
如果(N==0){
返回0;
}else如果(N==1 | | N==2){
返回1;
}否则{
返回fibo_v()+fibo_v();
}
}
IDE还告诉我,在N==0之后,代码是不可访问的
- N是如何实例化的
- 为什么
会解决无条件实例化问题李>if constexpr()
if constexpr
将解决此问题,但您需要确保在任何地方都使用它,而不仅仅是在第一个if
上:
template<unsigned N>
inline constexpr unsigned fibo_v() {
if constexpr (N == 0) {
return 0;
} else if constexpr (N == 1 || N == 2) {
return 1;
} else {
return fibo_v<N - 1>() + fibo_v<N - 2>();
}
}
模板
内联constexpr无符号fibo_v(){
如果constexpr(N==0){
返回0;
}如果constexpr(N==1 | | N==2){
返回1;
}否则{
返回fibo_v()+fibo_v();
}
}
正如@IgorTandetnik所解释的:如果没有
if constexpr
,编译器将函数的所有部分视为必须编译的有效代码,即使它知道它无法执行。这意味着它将需要实例化fivo\u v
,即使N==0
您需要使用专门化,或者如果constexpr
。如前所述,fibo_v
被无条件实例化,即使当N==0
时,也会以无限递归结束。请将标题更新为“非点击诱饵”:也就是说,使其与实际问题相关,这是关于特定模板的使用和此类问题。这不是我的问题。此外,“什么是可能的…”这个原始问题仍然存在。更好的总结可能是“为什么这个斐波那契模板超过了初始化深度?”,例如,或者关注另一个可能被认为相关的问题。“程序中可能发生什么?”(带有相关的非模板错误)具有相同的缺陷。没有足够的焦点,因为它需要一组“所有可能性”。谢谢,你能解释为什么我必须使用constexpr吗?我不明白为什么会出现“递归模板实例化超过最大深度”错误消息。我在这里找到了一个解释: