在 C++14 中,我们得到 upgraded version of constexpr
这意味着现在可以使用循环、if 语句和开关。
在 C++11 中,递归已经成为可能。
我知道 constexpr
函数/代码应该很简单,但问题仍然存在:如何有效地调试它?
即使在“The C++ Programming Language, 4th Edition”中也有一句话说调试很困难。
最佳答案
调试 constexpr
函数有两个重要方面。
1) 确保他们计算出正确的结果
在这里,您可以使用常规的单元测试、断言或运行时调试器来单步调试您的代码。与测试常规函数相比,这里没有什么新东西。
2) 确保它们可以在编译时进行评估
这可以通过将函数评估为 constexpr
变量赋值的右侧来测试。
constexpr auto my_var = my_fun(my_arg);
为了使其工作,my_fun
可以 a) 仅将编译时常量表达式作为实际参数。 IE。 my_arg
是文字(内置或用户定义)或先前计算的 constexpr
变量或模板参数等,并且 b) 它只能调用 constexpr
函数在其实现中(所以没有虚拟,没有 lambda 表达式等)。
注意:在 constexpr
函数的编译时评估期间,实际上很难调试编译器的代码生成实现。您必须将调试器附加到编译器,并且实际上能够解释代码路径。也许 future 的 Clang 版本会让你这样做,但在当前技术下这是不可行的。
幸运的是,因为您可以解耦 constexpr
函数的运行时和编译时行为,调试它们并不像调试模板元程序(只能在编译时运行)那么难.
关于c++ - 如何有效地调试 constexpr 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20966882/