【问题标题】:template-parameter vs type-parameter vs non-type parameter模板参数 vs 类型参数 vs 非类型参数
【发布时间】:2013-03-12 18:47:45
【问题描述】:

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

非类型参数

 template<int N>
 class foo {};

模板参数

template<typename T>
class bar {};

类型参数

 ?????

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

14.1 模板参数[temp.param]

9 ... 可以为任何类型的模板参数 (type, non-type, template) 指定默认模板参数,该模板参数不是模板参数包 (14.5.3) . ...

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

然后在第 14.1.2 节中将它们称为 typenon-type,并将模板参数称为泛化。

那是什么?有人可以解释吗?

【问题讨论】:

    标签: c++ templates language-lawyer


    【解决方案1】:

    据说template-parameter有3种

    1. 类型模板参数

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

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

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

    但我同意这是错误的定义。在语法中,以template 开头的template-parametertype-parameter 的可能产生式之一。

    【讨论】:

      【解决方案2】:

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

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

      这里,T 是一个模板参数U 是一个类型参数N 是一个非类型参数。

      然后在第 14.1.2 节中将它们称为类型和非类型,并将模板参数称为泛化。

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

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

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

      由于 template template-parameterstemplate template-arguments 被视为用于描述目的的类型,因此 术语非类型参数非类型参数用于指代非类型、非模板参数和参数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-05-23
        • 2011-08-06
        • 2014-05-18
        • 1970-01-01
        • 2021-03-18
        相关资源
        最近更新 更多