template-parameter vs type-parameter vs non-type parameter

时间:2013-03-12 18:47:46

标签: c++ templates language-lawyer

在第14章(模板)中的C ++标准中,它引用了具有多个不同名称的模板参数,具体取决于它们的上下文。

非类型参数

 template<int N>
 class foo {};

模板参数

template<typename T>
class bar {};

型参数

 ?????

在下面的引文中,它看起来好像是三个不同的东西,但是我无法弄清楚 type-parameter 是什么?

14.1模板参数[temp.param]

  

9 ...可以为任何非模板参数包的模板参数(类型,非类型,模板)指定默认模板参数(14.5.3) 。 ...

您可以在此处看到它有三个不同的模板参数名称。如果 template-parameter 是对其他两个的概括,那么为什么要在上面的列表中包含它。

在第14.1.2节中,它将它们称为 type non-type ,并将template-parameter称为泛化。

那是什么?谁能解释一下?

2 个答案:

答案 0 :(得分:7)

它说有三种类型的模板参数

  1. 输入模板参数

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

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

    template<template<class> class T>
    class baz {};
    
  4. 但我确实认为这个定义不明确。在语法中,以template开头的模板参数 type-parameter 的可能产生之一。

答案 1 :(得分:5)

在您使用此措辞的上下文中,“模板参数”是类模板的参数。例如:

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

此处,T模板参数U类型参数N是非类型参数。

  

在第14.1.2节中,它将它们称为type和non-type,将template-parameter称为泛化。

重要的是消除“模板”一词的使用歧义。在许多情况下,它仅用于表示那些是“模板”的参数(例如,与函数的参数相对)。在这种情况下,这些类别(分别)成为“模板模板参数”,“模板类型参数”和“模板非类型参数

此外,在某些情况下,第一类也被认为是定义“非类型参数”,因为可以为其提供的参数不是类型(它们是模板)。因此,有时您可能会发现“非类型,非模板参数”的措辞严格指代第三类(即上面的N类别)。

另见C ++ 11标准第14.1 / 2段脚注136:

  

由于模板模板参数模板模板参数被视为用于描述目的的类型,   术语非类型参数非类型参数用于引用非类型,非模板参数和参数。