Bjarne 关于编译时递归的评论是指评估模板的方式,而不是生成代码的工作方式。例如,考虑以下模板:
template <typename... Args> struct Length;
template <> struct Length<> {
static const size_t value = 0;
};
template <typename First, typename... Rest> struct Length {
static const size_t value = 1 + Length<Rest>::value;
};
在这里,如果我们实例化Length<int, int, int, int>
then
Length<int, int, int, int>
实例化
Length<int, int, int>
, 它实例化
Length<int, int>
, 它实例化
Length<int>
, 它实例化
Length<>
这个过程是 Bjarne 所指的模板的纯函数递归扩展。这是扩展模板以生成递归并在编译时完成的代码的过程,而不是在编译器中展开的实际生成的代码。C++ 编译器可以自由地优化代码,但它认为合适,只要它不改变代码的基本含义。如果你有一个使用这种编译时递归风格的递归函数,编译器可能会优化它,但不能保证它会。C++ 标准对允许或不允许的优化类型没有任何限制,只是描述了所需的行为,因此没有关于此的规则。
希望这可以帮助!