在这条准则下constexpr everything
,随着consteval
C++20 的引入,越来越多的代码在编译时被评估。
这就引出了一个明显的问题:我们如何调试它?
目前,唯一的提示是编译器错误。但是如果代码编译了,但仍然没有达到预期的效果怎么办。有什么工具可以帮助解决这个问题吗?有什么检查的可能吗?
一个相关的问题是:如何知道哪些会在编译时真正“执行”,哪些会在运行时保留,尽管有限定符。
在这条准则下constexpr everything
,随着consteval
C++20 的引入,越来越多的代码在编译时被评估。
这就引出了一个明显的问题:我们如何调试它?
目前,唯一的提示是编译器错误。但是如果代码编译了,但仍然没有达到预期的效果怎么办。有什么工具可以帮助解决这个问题吗?有什么检查的可能吗?
一个相关的问题是:如何知道哪些会在编译时真正“执行”,哪些会在运行时保留,尽管有限定符。
我个人使用 static_assert 作为 constexpr 函数的调试器,它不是最好的工具,但它可以替换代码之类的if (irational_value) cout<<"bug";
。如果第 6 个斐波那契数实际上是 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;
}