C++ 编译时计算的迭代可能性

C++ 编译时计算的迭代可能性,c++,compiler-construction,variadic-templates,constexpr,compile-time,C++,Compiler Construction,Variadic Templates,Constexpr,Compile Time,在我的理解中,编译时计算是编译器可以计算的任何东西,而不是在程序执行期间计算的部分,以提高性能。当程序执行时可以进行迭代计算,但在编译时计算期间不允许进行迭代计算。一个麻烦且具体的例子是可变模板,人们自然会想到迭代来处理提供的各种类型,但标准和编译器迫使程序员递归地处理它们 通常,所有编译时计算都是通过递归而不是迭代来处理的。据我所知,预期在编译时计算的constexpr函数也应该是递归的。是什么使得编译时的迭代被禁止?当我在中实现消除常量子表达式作为优化时,问题是递归基本上已经在代码生成过程中

在我的理解中,编译时计算是编译器可以计算的任何东西,而不是在程序执行期间计算的部分,以提高性能。当程序执行时可以进行迭代计算,但在编译时计算期间不允许进行迭代计算。一个麻烦且具体的例子是可变模板,人们自然会想到迭代来处理提供的各种类型,但标准和编译器迫使程序员递归地处理它们


通常,所有编译时计算都是通过递归而不是迭代来处理的。据我所知,预期在编译时计算的constexpr函数也应该是递归的。是什么使得编译时的迭代被禁止?

当我在中实现消除常量子表达式作为优化时,问题是递归基本上已经在代码生成过程中发生了。您实际上不需要定义变量,因为它们只是被常量替换

另一方面,如果您试图运行循环,那么您不仅需要具有在运行时不仅执行常量操作的代码,还需要具有语言的完整解释器。您需要能够声明变量、设置和接收它们的值(作为循环计数器),更糟糕的是,您需要检测无限循环,这样编译器就不会挂起(我的意思是,
while(true);
是一个完美的常量表达式)


简而言之,由于解析器、AST和优化器的性质,在编译时递归地计算部分要比实现完整的控制流、实现循环和变量操作简单得多。

递归是一种迭代形式。您也可以使用
std::integer\u序列
现在在c++14中允许对
constepr
函数进行常规迭代。问题在于检查函数是否为
constexpr
。“递归和无迭代更容易。”我认为rici。