C++重载解析
2013-11-28 13:34 robturtle 阅读(499) 评论(0) 编辑 收藏 举报重载解析(overloading resolution)的规则决定了编译器为一个函数调用选用哪个函数定义。一般过程如下:
- 将名称相同的函数/模板函数找到并创建候选列表
- 从中挑选参数数目正确,符合完全匹配/隐式转换规则的函数创建可行函数列表
- 存在最佳可行函数 ? 使用 : 报错
完全匹配包括形参和实参类型完全一样或无关紧要的转换,无关紧要的转换包括引用和值之间,数组到指针,函数到函数指针,加上const/volatile限定符。
特殊规则: 当形参是指针/引用时,T&/T*会优先和T&/T*匹配,其次才是const T&/T*。而若分别定义了T和const T作为形参,则将产生二义性错误。
部分排序规则(partial ordering rules)
需要较少转换的候选函数优先级更高,典型地:
template <typename T> void foo(T t);
template <typename T> void foo(T* t);
/* ... */
int a;
foo(&a);
此处foo(&a)
将与第一个模板匹配,因为第二个模板多了一个int模板到形参int*的转换过程。
常见误区:数组形参
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。