模板和名称转换
在模板定义,具有名称的三种类型。
局部声明的名称,包括模板的名称以及任何声明的名称在模板定义中。
封闭范围中的名称在模板定义之外。
在某些方面依赖于模板参数的名称,引用相关的名称。
在前两个名称也与类别和功能范围时,名称的转换特定规则在模板定义了处理依赖名称中添加的复杂性。 这是因为,编译器知道一点有关这些名称,直到对模板进行实例化,,因为它们可能是模板参数的完全不同的类型。 Nondependent 名称查找基于通常规则以及在模板的定义。 这些名称,是模板参数的独立性,为无限搜索的模板专用化。 依赖名称未找到,直到模板实例化以及每专用化单独查找。
,如果它依赖于模板参数,类型为相关。 具体而言,则为; 如果是,类型是依赖:
模板参数:
T
一个限定的限定名包括一个相关类型:
T::myType
限定名,如果该非限定部分标识一个相关类型:
N::T
该基础是一个依赖项类型的常量或变量类型:
const T
指针,引用,、或函数根据一个相关类型的指针类型:
T *, T &, T [10], T (*)()
大小作为模板参数数组:
template <int arg> class X { int x[arg] ; // dependent type }
从模板参数构造的模板类型:
T<int>, MyTemplate<T>
键入依赖项和值依赖项
名称和表达式根据模板参数分类为类型依赖项或值依赖项,基于模板参数是否是类型参数还是值参数。 此外,在具有一个类型依赖项的模板声明的所有标识符在模板参数被视为值依赖项,如整型或枚举类型初始化一个值相关的表达式。
相关类型和值相关的表达式是包含变量是类型依赖项或值依赖项的表达式。 不同的这些表达式可基于用于模板的参数的语义,。