模板参数vs类型参数vs非类型参数
template-parameter vs type-parameter vs non-type parameter
在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
是非类型参数。
在这里,消除"模板"这个词的歧义是很重要的。在许多上下文中,它只是用来表示那些是"模板"的参数(例如,与函数的参数相反)。在这种情况下,这些类别变成(分别)"模板模板参数", "模板类型参数"answers"模板非类型参数"。 此外,在某些情况下,第一个类别也被认为定义了"非类型形参",因为可以为它提供的参数不是类型(它们是模板)。因此,有时您可能会发现"非类型,非模板参数"这一措辞严格指的是第三类(即上述在第14.1.2节中,它只将它们称为类型和非类型,并将模板形参作为泛化。
N
的类别)。也见c++ 11标准第14.1/2段的脚注136:
由于模板模板形参和模板模板实参被视为用于描述的类型,因此术语非类型形参和非类型实参用于指代非类型、非模板形参和实参。
相关文章:
- 在 c++ 中的模板实例化中使用带有构造函数的类作为类型参数
- 如何解决一元"*"(有"字符")错误的无效类型参数?
- "std::shared_ptr":不是参数"_Ty"的有效模板类型参数
- 具有可变参数非类型参数的模板专用化
- 函数类型参数的模板参数推导
- PowerShell 使用结构类型参数调用 C++ DLL 的导出函数
- 对于非常量指针类型的参数,未调用具有常量指针模板类型参数的功能
- 为模板传递非类型参数 agument
- 为什么带有类型参数的运算符 () 可以应用于 result_of 上下文中的类型?
- 使用其他模板类型参数作为要在函数签名中使用的类型别名声明
- 如何避免具有相同类型参数的函数中的错误
- 将内置类型变量传递给只有一个类类型参数的"+"运算符函数时自动类型转换的构造函数
- c++非类型参数包扩展
- 如何实现对参数顺序不可知的std::same_as的广义形式(即对于两个以上的类型参数)
- 在不同的模板参数包之间分发非类型参数包
- 如何在使用容器和字符串时强制使用显式分配器类型参数
- 错误:一元"*"的类型参数无效(具有"int"):使用 mergesort 计算
- EXPECT_CALL具有 unique_ptr 引用类型参数的模拟函数
- 重新解释一个模板非类型参数:clang c++14 vs c++1z
- 模板参数vs类型参数vs非类型参数