模板参数vs类型参数vs非类型参数



在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节中,它只将它们称为类型非类型,并将模板形参作为泛化。

那是什么呢?有人能解释一下吗?

有三种类型的模板参数:

  1. 类型模板参数

    template<typename T>
    class bar {};
    
  2. 非类型模板参数

    template<int N>
    class foo {};
    
  3. 模板模板参数

    template<template<class> class T>
    class baz {};
    

我同意这个定义不好。在语法中,以template开头的模板参数类型参数的可能结果之一。

在你使用这种措辞的上下文中,"模板参数"是类模板的参数。例如:

template<template<typename, typename> class T, typename U, int N>
struct { ... };

其中,T模板参数U类型参数N是非类型参数。

在第14.1.2节中,它只将它们称为类型和非类型,并将模板形参作为泛化。

在这里,消除"模板"这个词的歧义是很重要的。在许多上下文中,它只是用来表示那些是"模板"的参数(例如,与函数的参数相反)。在这种情况下,这些类别变成(分别)"模板模板参数", "模板类型参数"one_answers"模板非类型参数"。 此外,在某些情况下,第一个类别也被认为定义了"非类型形参",因为可以为它提供的参数不是类型(它们是模板)。因此,有时您可能会发现"非类型,非模板参数"这一措辞严格指的是第三类(即上述N的类别)。

也见c++ 11标准第14.1/2段的脚注136:

由于模板模板形参模板模板实参被视为用于描述的类型,因此术语非类型形参非类型实参用于指代非类型、非模板形参和实参。

最新更新