问题描述
根据准则constexpr everything
并在C ++ 20中引入consteval
,在编译时将评估越来越多的代码。
这导致了一个显而易见的问题:我们如何调试它?
当前唯一的提示是编译器错误。但是,如果代码可以编译,但仍未达到预期的效果,该怎么办。有没有什么工具可以帮助您呢?有检查的可能性吗?
一个相关的问题是:如何知道哪些将在编译时真正“执行”,哪些将在运行时保持合格,尽管有限定符。
解决方法
我个人使用static_assert作为constexpr函数的调试器,虽然它不是最好的工具,但它可以代替if (irational_value) cout<<"bug";
这样的代码
第六个斐波那契数实际上是13时,在编译时求值的愚蠢示例
#include <vector>
#include <iostream>
int main(){
constexpr unsigned sixth_fib=[](){
unsigned prev=1;
unsigned sum=1;
for (unsigned i=0;i<5;i++)
{
auto tmp=sum;
sum+=prev;
prev=tmp;
}
return sum;
}();
static_assert(sixth_fib==13);
std::cout<<sixth_fib<<std::endl;
}