对函数的调用是不明确的,但为什么呢?

Rit*_*uly 4 c++ overloading ambiguity clang

#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; 
}
Run Code Online (Sandbox Code Playgroud)

在 apple clang 编译器中对“x”的调用不明确,为什么?

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

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

Nat*_*son 8

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

最佳可行功能

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

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

...

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