函数优先级
函数调用过程
- 列出所有名字与要调用的函数相同的函数。
- 汇总出有正确数目与类型的参数的函数(允许隐式转换)
- 决定最优函数,调用它,如果没有,即没有匹配的函数或匹配的函数分不出优劣,报错
如何决定最佳可行函数(从上到下优先级递减)
- 准确匹配
- 整型提升转换,e.g. char to int, float to double
- 标准(算术)转换,e.g. int to char,long to double
- 用户定义的转换(在类体系内的转换)
准确匹配
准确匹配允许一些转换,经过这些转换的参数与准确匹配的参数具有相同优先级。
Actual Argument | Formal Argument |
---|---|
Type | Type & |
Type & | Type |
Type[] |
|
Type (argument-list) | Type(*) |
Type | const Type |
Type | volatile Type |
Type * | const Type * |
Type * | volatile Type * |
e.g.
如果我定义了int func(Type para) 和 int func(Type ¶),两者都是准确匹配,此时没有最佳匹配。
- 最佳匹配
准确匹配的前提下,以下情况下存在最佳匹配:
- 指向const实参的指针和引用对于const的指针和引用更加匹配,对于non-const亦然。
- 对于模板函数,模板具体化,非模板函数,越具体化的优先级越高,其中:
- 函数 < 模板具体化 < 非模板函数
- 对于同样是模板具体化或同样是模板函数,在模板参数推断时所需步骤少的具体化程度高。