我正在尝试了解重载解决方法。
为什么这样模棱两可:
void func(double, int, int, double) {}
void func(int, double, double, double) {}
void main()
{
func(1, 2, 3, 4);
}
但这不是吗?
void func(int, int, int, double) {}
void func(int, double, double, double) {}
void main()
{
func(1, 2, 3, 4);
}
在第一种情况下,有2个精确参数匹配和2个转换(针对1个精确匹配和3个转换),在第二种情况下,有3个精确匹配和1个转换针对1个精确匹配和3个转换。
那么,为什么一个模棱两可,而一个模棱两可呢?这里的逻辑是什么?
最佳答案
重载解析规则仅在所有匹配项的集合上定义部分顺序-如果重载F1
比F2
更好,则并不意味着F2
比F1
更好。可以将确切的偏序视为在k
维度中比较两个点,其中参数数量为k
。让我们在k
-dim space-(x_1, x_2,..., x_k) < (y_1, y_2,..., y_k) if x_i <= y_i for all i and x_j < y_j for at least one j
中的点上定义此偏序。这恰好是该标准定义的候选非模板函数的部分顺序。
让我们看看您的示例:
void func(double, int, int, double) {}
vvv vvv vvv
better better equal
void func(int, double, double, double) {}
vvv vvv
better equal
因此,两个过载都不比另一个过载好。
在第二个示例中:
void func(int, int, int, double) {}
vvv vvv vvv vvv
equal better better equal
void func(int, double, double, double) {}
vvv
equal
现在,除了一个参数外,第一个重载比第二个重载更好,并且永远不会比第二个重载。因此,没有歧义-偏序确实确实更好地声明了第一个。
(以上描述未考虑功能模板。您可以在cppreference上找到更多详细信息。)
关于c++ - 如何在过载解析算法中确定歧义?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29090692/