Отладка во время компиляции в C++
Согласно максиме constexpr everything
и с введением consteval
в C++20 все больше и больше кода оценивается во время компиляции.
Это приводит к очевидному вопросу: как это отладить?
Единственные подсказки в настоящее время - это ошибки компилятора. Но что, если код компилируется, но все равно не выполняет ожидаемых действий. Есть ли какие-нибудь инструменты, которые могут в этом помочь? Любые возможности проверки?
Связанный с этим вопрос: как узнать, какие из них действительно будут "выполнены" во время компиляции, а какие останутся во время выполнения, несмотря на квалификатор.
0 ответов
Я лично использую 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;
}