在c++标准第14章(模板)中,它指的是模板形参,根据它们的上下文有几个不同的名字。
实参数
template<int N>
class foo {};
模板参数
template<typename T>
class bar {};
类型参数
?????
在下面的引用中,它看起来像是三个不同的东西,但是我不能弄清楚类型参数是什么?
14.1模板参数[temp.param]
9…可以为任何类型的模板形参(type, non-type, template)指定默认模板形参(14.5.3). ...
您可以在这里看到它有三个不同的模板参数名称。如果template-parameter是其他两个的泛化,那么为什么要把它包含在上面的列表中呢?
在第14.1.2节中,它只将它们称为类型和非类型,并将模板形参作为泛化。
那是什么呢?有人能解释一下吗?
有三种类型的模板参数:
-
类型模板参数
template<typename T> class bar {};
-
非类型模板参数
template<int N> class foo {};
-
模板模板参数
template<template<class> class T> class baz {};
我同意这个定义不好。在语法中,以template
开头的模板参数是类型参数的可能结果之一。
在你使用这种措辞的上下文中,"模板参数"是类模板的参数。例如:
template<template<typename, typename> class T, typename U, int N>
struct { ... };
其中,T
是模板参数, U
是类型参数, N
是非类型参数。
在这里,消除"模板"这个词的歧义是很重要的。在许多上下文中,它只是用来表示那些是"模板"的参数(例如,与函数的参数相反)。在这种情况下,这些类别变成(分别)"模板模板参数", "模板类型参数"one_answers"模板非类型参数"。 此外,在某些情况下,第一个类别也被认为定义了"非类型形参",因为可以为它提供的参数不是类型(它们是模板)。因此,有时您可能会发现"非类型,非模板参数"这一措辞严格指的是第三类(即上述在第14.1.2节中,它只将它们称为类型和非类型,并将模板形参作为泛化。
N
的类别)。也见c++ 11标准第14.1/2段的脚注136:
由于模板模板形参和模板模板实参被视为用于描述的类型,因此术语非类型形参和非类型实参用于指代非类型、非模板形参和实参。