C++ C+中的编译时调试+;

C++ C+中的编译时调试+;,c++,compilation,constexpr,c++20,consteval,C++,Compilation,Constexpr,C++20,Consteval,在maximconstexpr everything下,随着C++20中consteval的引入,越来越多的代码在编译时被评估 这引出了一个显而易见的问题:我们如何调试它 目前唯一的提示是编译器错误。但是,如果代码已编译,但仍然没有达到预期效果,该怎么办。有没有什么工具可以帮你?有检查的可能性吗 一个相关的问题是:如何知道哪些将在编译时真正“执行”,哪些将在运行时保留,尽管有限定符。我个人使用static\u assert作为constepr函数的调试程序,它不是最好的工具,但它可以替代类似if

在maxim
constexpr everything
下,随着C++20中
consteval
的引入,越来越多的代码在编译时被评估

这引出了一个显而易见的问题:我们如何调试它

目前唯一的提示是编译器错误。但是,如果代码已编译,但仍然没有达到预期效果,该怎么办。有没有什么工具可以帮你?有检查的可能性吗


一个相关的问题是:如何知道哪些将在编译时真正“执行”,哪些将在运行时保留,尽管有限定符。

我个人使用static\u assert作为constepr函数的调试程序,它不是最好的工具,但它可以替代类似
if(irational\u值)的代码cout
constexpr
函数可以在非constexpr上下文中调用,以便您可以将它们作为常规函数进行调试。@Jarod42:这不适用于已标记的
consteval
。您也不能轻松地为调试插入constexpr函数;虽然可以使用
std::is_constant\u evaluated
,但这无助于复制常量表达式中的任何用法。偶然发现了这个2017 Herb Sutter talk:右下角它说:C++17=>需要编译时调试。一分钟后,他甚至列出了编译时手表。从那以后的三年里,我们做了些什么?;-)其中的宇宙是静态的,或者在这个宇宙中是动态的。我不说这是一个完整的调试机制,但什么都不是。对于一个大程序,有人必须使用各种调试方法,使用这种方法是最“动态”的方法,您可以在任何地方使用,但请记住,您可能永远不必在
constexpr
上下文中执行堆栈跟踪或检查内存泄漏,因此
constexpr
上下文中没有valgrind。但实际上,我相信在
constexpr
上下文中使用gdb将非常好
#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;

}