gpt4 book ai didi

c++ - 在c++中使用非类型模板参数可能发生什么,为什么此代码无法访问?

转载 作者:行者123 更新时间:2023-12-02 10:17:36 26 4
gpt4 key购买 nike

非类型模板参数有什么可能,标准暗示了哪些限制?

例如,此代码超出了模板初始化的深度:

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>();
}
}

IDE还告诉我,在N == 0之后,代码无法访问。
  • 如何实例化N?
  • 为什么if constexpr ()解决无条件实例化?
  • 最佳答案

    使用if constexpr可以解决该问题,但您需要确保在eveywhere中使用它,而不仅仅是在第一个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>();
    }
    }

    正如@IgorTandetnik解释的那样:如果没有 if constexpr,则编译器会将函数的所有部分视为必须编译的有效代码,即使它知道无法执行也是如此。这意味着即使在 fivo_v<N-1>时也需要实例化 N==0

    关于c++ - 在c++中使用非类型模板参数可能发生什么,为什么此代码无法访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61428431/

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