CPP Templates 之 名称分类和名称查找

名称的分类:

标示符 identifier:一个只有字符、数字和下划线组成的不间断字符序列
运算id operator-function id:运算符,例如*、%、+\-,
强制转换id conversation-function id:static_cast、dynamic_cast之类
模板id template id:模板名称
非受限id unqualified-id:广义化的标示符 identifier,
受限id qualified-id:用一个类名或者名字空间名称对一个unqualified-id进行限定
受限名称 qualified name:
非受限名称 unqualified name:
依赖型名称 dependent name:依赖于模板参数
非依赖型名称 undependent name:不依赖于模板参数

名称查找:

受限名称:在受限作用域内查找就好
非受限名称:在调用点可见的和ADL argument-dependent lookup

ADL:
    在函数调用过程中 如果普通查找就能找到函数的名字,那么就不会应用ADL。如果把被调用函

数的名称用圆括号()括起来,例如(max),也不会调用ADL。否则,如果名称后面的括号里面有一个

或多个实参表达式,那么这些实参的associated class和associated namespace。
    对于给定类型,对于associated class和associated namespace所组成集合的准确定义,我们

可以通过下列规则来确定:
1.对于基本类型,该集合为空
2.对于指针和引用类型,该集合是指针所指向的类和引用锁引用的类型的associated class和associated namespace
3.对于枚举类型,associated namespace就是其所在的namespace;对于类成员,起associtated

class指的是它所在的类。
4.对于class类型(包括联合类型),associated class集合包括:该class本身、它的外围类型、

它的直接和间接基类。associated namespace集合是每个associated class所在的namespace。如

果这个类是类模板实例化产生的,那么还包括:模板类型实参本身的类型、声明模板的模板实参所

在的class和namespace
5.对于函数类型,该集合包括所有参数类型和返回类型的associated class和associated

namespace
6.对于类X的成员指针类型,除了包括成员相关的associated class和associated namespace之外

,该集合还包括与X相关的associated class和associated namespace;

你可能感兴趣的:(template)