C++的编译模型
单遍编译
在单遍编译时,编译器只能根据目前看到的代码做出决策,读到后面的代码也不会影响前面做出的决定。这很影响名字查找和函数重载决议。
对于名字查找,C++中的名字包括类型名,函数名,变量名,typedef
名,template
名。
对于下面这行代码:
Foo<T> a; //Foo,T,a这三个名字都不是macro
根据之前出现的代码不同,上面这行语句至少有三种可能性。
Foo
是个template<typename X> class Foo;
,T
是type
,那么这句话就是以T
为模板类型参数具体化了Foo<T>
类型,并定义了变量a
。Foo
是个template<int X> class Foo
,T
是const int
变量,这句话以T
为非类型模板参数具体化了Foo<T>
类型,并定义了变量a
。Foo、T、a
都是int
,没啥用的表达式。