【问题标题】:constexpr base case not considered during compilation编译期间不考虑 constexpr 基本情况
【发布时间】:2023-02-12 15:16:29
【问题描述】:

我在尝试 constexpr 函数时偶然发现了以下实现斐波那契数列的示例

fibon2 和 fibon1 之间没有逻辑上的区别,但我仍然遇到超出 fibon1 模板初始化的编译错误。

我在这里缺少什么?

#include <cstdint>
#include <iostream>

template <int32_t x>                                                                                                                                                                                                                                                          
constexpr int32_t fibon2() {                                                                                                                                                                                                                                                  
  if constexpr (x == 0)                                                                                                                                                                                                                                                       
    return 1;                                                                                                                                                                                                                                                                 
  else if constexpr (x == 1)                                                                                                                                                                                                                                                  
    return 1;                                                                                                                                                                                                                                                                 
  else if constexpr (x == 2)                                                                                                                                                                                                                                                  
    return 1;                                                                                                                                                                                                                                                                 
  else                                                                                                                                                                                                                                                                        
    return fibon2<x - 1>() + fibon2<x - 2>();                                                                                                                                                                                                                                 
}                                                                                                                                                                                                                                                                             
template <int32_t x>                                                                                                                                                                                                                                                          
constexpr int32_t fibon1() {                                                                                                                                                                                                                                                  
  if constexpr (x == 0) return 1;                                                                                                                                                                                                                                             
  if constexpr (x == 1) return 1;                                                                                                                                                                                                                                             
  if constexpr (x == 2) return 1;                                                                                                                                                                                                                                             
                                                                                                                                                                                                                                                                              
  return fibon1<x - 1>() + fibon1<x - 2>();                                                                                                                                                                                                                                   
}                                                                                                                                                                                                                                                                             
int32_t fibon3(int32_t x) {                                                                                                                                                                                                                                                   
  if (x == 1) return 1;                                                                                                                                                                                                                                                       
  if (x == 2) return 1;                                                                                                                                                                                                                                                       
  return fibon3(x - 1) + fibon3(x - 2);                                                                                                                                                                                                                                       
}                                                                                                                                                                                                                                                                             
int main() {                                                                                                                                                                                                                                                                  
  
  std::cout << fibon3(2) << std::endl;                                                                                                                                                                                                                                        
  std::cout << fibon2<2>() << std::endl;                                                                                                                                                                                                                                      
  std::cout << fibon1<2>() << std::endl;                                                                                                                                                                                                                                      
  
  return 0;                                                                                                                                                                                                                                                                   
} 

【问题讨论】:

  • “没有逻辑上的区别……”就在这里。

标签: c++ c++17 constexpr if-constexpr


【解决方案1】:

fibon1 中的返回不在 constexpr 下,因此无论提供的模板参数如何都必须编译。

Clang 很好地展示了这一点:https://godbolt.org/z/577f15Kv1

【讨论】:

    猜你喜欢
    • 2011-08-28
    • 2013-11-13
    • 1970-01-01
    • 1970-01-01
    • 2019-07-08
    • 2013-09-01
    • 2021-01-21
    • 2021-09-19
    相关资源
    最近更新 更多