C++重载解析

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

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

彻底匹配包括形参和实参类型彻底同样或可有可无的转换,可有可无的转换包括引用和值之间,数组到指针,函数到函数指针,加上const/volatile限定符。markdown

特殊规则: 当形参是指针/引用时,T&/T*会优先和T&/T*匹配,其次才是const T&/T*。而若分别定义了T和const T做为形参,则将产生二义性错误。app

部分排序规则(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*的转换过程。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。指针

相关文章
相关标签/搜索