C++重载解析

时间:2022-10-21 14:19:01

重载解析(overloading resolution)的规则决定了编译器为一个函数调用选用哪个函数定义。一般过程如下:

  1. 名称相同的函数/模板函数找到并创建候选列表
  2. 从中挑选参数数目正确,符合完全匹配/隐式转换规则的函数创建可行函数列表
  3. 存在最佳可行函数 ? 使用 : 报错

完全匹配包括形参和实参类型完全一样或无关紧要的转换,无关紧要的转换包括引用和值之间,数组到指针,函数到函数指针,加上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。