Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c+;中的非类型模板参数有什么可能+;为什么这个代码是不可访问的?_C++_Templates - Fatal编程技术网

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吗?我不明白为什么会出现“递归模板实例化超过最大深度”错误消息。我在这里找到了一个解释: