此代码无法编译并达到模板实例化递归限制
#include <iostream>
#include <utility>
template <int N>
struct factorial {
static const int value = N * factorial::value; // (*)
};
template <>
struct factorial<0> {
static const int value = 1;
};
int main() {
constexpr int result = factorial<5>::value;
std::cout << result;
}
我很想知道为什么顺便说一下......在标有
factorial
的内部范围中使用的(*)
是否使用相同的参数(5)实例化,因为factorial
是该范围中的从属名称?
您要查找的术语是注入的类名。特别是对于模板(来自 cppreference):
像其他类一样,类模板有一个注入类名。这 注入类名可以用作模板名或类型名。
在以下情况下,注入的类名被视为 类模板本身的模板名称:
- 之后是
<
- 它用作模板模板参数
- 它是朋友类模板声明的详细类说明符中的最终标识符。
否则,它被视为类型名称,等同于 模板名称后跟类的模板参数 模板包含在
. 中<>
最后一段是相关的。您将其用作类型名称,而不是模板名称。简而言之:是的,
factorial::value
是 factorial<N>::value
的简写。