在没有模板参数的情况下实例化 C++ 模板会导致无限递归 - 为什么?

问题描述 投票:0回答:1

此代码无法编译并达到模板实例化递归限制

#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
是该范围中的从属名称?

c++ templates metaprogramming
1个回答
1
投票

您要查找的术语是注入的类名。特别是对于模板(来自 cppreference):

像其他类一样,类模板有一个注入类名。这 注入类名可以用作模板名或类型名。

在以下情况下,注入的类名被视为 类模板本身的模板名称:

  • 之后是
    <
  • 它用作模板模板参数
  • 它是朋友类模板声明的详细类说明符中的最终标识符。

否则,它被视为类型名称,等同于 模板名称后跟类的模板参数 模板包含在

<>
.

最后一段是相关的。您将其用作类型名称,而不是模板名称。简而言之:是的,

factorial::value
factorial<N>::value
的简写。

© www.soinside.com 2019 - 2024. All rights reserved.