Ton*_*ion 4 c++ templates language-lawyer
在第14章(模板)中的C++标准中,它引用了具有多个不同名称的模板参数,具体取决于它们的上下文.
非类型参数
template<int N>
class foo {};
Run Code Online (Sandbox Code Playgroud)
模板参数
template<typename T>
class bar {};
Run Code Online (Sandbox Code Playgroud)
类型参数
?????
Run Code Online (Sandbox Code Playgroud)
在下面的引文中,它看起来好像这是三个不同的东西,但我无法弄清楚什么类型参数是什么?
14.1模板参数[temp.param]
9 ...可以为任何非模板参数包(14.5.3)的模板参数(类型,非类型,模板)指定默认模板参数....
您可以在此处看到它有三个不同的模板参数名称.如果template-parameter是其他两个的泛化,那么为什么要在上面的列表中包含它.
在14.1.2节中,它将它们称为type和non-type,将template-parameter称为泛化.
那是什么?谁能解释一下?
它说有三种类型的模板参数:
键入模板参数
template<typename T>
class bar {};
Run Code Online (Sandbox Code Playgroud)非类型模板参数
template<int N>
class foo {};
Run Code Online (Sandbox Code Playgroud)模板模板参数
template<template<class> class T>
class baz {};
Run Code Online (Sandbox Code Playgroud)但我同意这个定义不明确.在语法中,以... 开头的模板参数template是type-parameter的可能产生之一.
在您使用此措辞的上下文中,“ 模板参数 ”是属于类模板的参数。例如:
template<template<typename, typename> class T, typename U, int N>
struct { ... };
Run Code Online (Sandbox Code Playgroud)
在这里,T是模板参数,U是类型参数,并且N是非类型参数。
然后在14.1.2节中,将它们称为正类型和非类型,并将模板参数称为概括。
在此重要的是要消除对“模板”一词的使用。在许多情况下,它仅用于指示那些是“模板”的参数(例如,与函数的参数相反)。在这种情况下,这些类别分别成为“ 模板模板参数 ”,“ 模板类型参数 ”和“ 模板非类型参数 ”。
同样,在某些情况下,也考虑将第一类定义为“非类型参数”,因为可以为其提供的参数不是类型(它们是模板)。因此,有时您可能会发现“ 非类型,非模板参数 ”一词严格地指的是第三类别(即上述类别N)。
另请参阅C ++ 11标准第14.1 / 2段的脚注136:
由于出于描述目的,模板模板参数和模板模板参数被视为类型,因此术语非类型参数和非类型参数用于指代非类型,非模板参数和参数。