首页 > 解决方案 > 对函数的调用是模棱两可的,但为什么呢?

问题描述

#include <iostream>
using namespace std;

void x(int a,int b){
  cout<<"int int"<<endl;
}
void x(char a,char b){
  cout<<"char char"<<endl;
}

int main() {
  int a =2;char c ='a';
  x(a,c);
  return 0; 
}

苹果clang编译器中对'x'的调用不明确,为什么?

对于 x(int,int),第一个参数是直接匹配,第二个是 x(char, char) 的提升,据我所知,第一个参数是标准转换,也根据这个答案-> https://stackoverflow.com /a/28184631/13023201

并且提升应该优先于标准转换,然后应该调用 x(int,int)。那为什么会这样暧昧??

标签: c++clangoverloadingambiguity

解决方案


查看cppreference如何描述重载解析过程:

最佳可行功能

对于每对可行函数 F1 和 F2,从i第 - 个参数到i第 - 个参数的隐式转换序列进行排序以确定哪个更好(除了第一个参数,静态成员函数的隐式对象参数对排行)

如果 F1 的所有参数的隐式转换不比F2 的所有参数的隐式转换差,则 F1 被确定为比 F2 更好的函数,并且

...

x(int, int)是比x(char, char)第一个参数更好的匹配,因为inttoint是完全匹配并且inttochar是转换。但是对于第二个参数x(int, int)来说是一个更糟糕的匹配,因为它是一个提升而不是完全匹配。因此,这两个函数都不是比另一个函数更好的匹配,并且无法解决重载问题。


推荐阅读