重载解析(overloading resolution)的规则决定了编译器为一个函数调用选用哪一个函数定义。通常过程以下:数组
彻底匹配包括形参和实参类型彻底同样或可有可无的转换,可有可无的转换包括引用和值之间,数组到指针,函数到函数指针,加上const/volatile限定符。markdown
特殊规则: 当形参是指针/引用时,T&/T*会优先和T&/T*匹配,其次才是const T&/T*。而若分别定义了T和const T做为形参,则将产生二义性错误。app
须要较少转换的候选函数优先级更高,典型地:函数
template <typename T> void foo(T t); template <typename T> void foo(T* t); /* ... */ int a; foo(&a);
此处foo(&a)
将与第一个模板匹配,由于第二个模板多了一个int模板到形参int*的转换过程。url
常见误区:数组形参spa
template <typename T> void foo(T a[]); template <typename T> void foo(T * a[]); /* ... */ int a = 1, b = 2, c = 3; int *pd[] = {&a, &b, &c}; foo(pd);
注意这里对T * a[]
的解析,是一个指向类型为T *
的数组。当模板替换的时候,T * []
将做为该数据的类型总体,所以不存在上述的多一个转换过程的状况。且模板2比模板1更具体,所以将选择模板2。指针