chamada para função é ambígua, mas por quê?

Dec 12 2020
#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; 
}

chamada para 'x' é ambígua no compilador Apple Clang, por quê?

para x (int, int), o primeiro argumento é uma correspondência direta e o segundo é uma promoção para x (char, char) o primeiro argumento é uma conversão padrão como eu sei e também de acordo com esta resposta-> https://stackoverflow.com/a/28184631/13023201

E a promoção deve ter preferência sobre a conversão padrão, então x (int, int) deve ser chamado. Então por que isso é ambíguo ??

Respostas

8 NathanPierson Dec 12 2020 at 15:51

Observando como cppreference descreve o processo de resolução de sobrecarga:

Melhor função viável

Para cada par de funções viáveis ​​F1 e F2, as sequências de conversão implícita do i-ésimo argumento para i-ésimo parâmetro são classificadas para determinar qual é o melhor (exceto o primeiro argumento, o argumento de objeto implícito para funções de membro estáticas não tem efeito sobre o classificação)

F1 é determinado como uma função melhor do que F2 se as conversões implícitas para todos os argumentos de F1 não forem piores do que as conversões implícitas para todos os argumentos de F2, e

...

x(int, int)é uma correspondência melhor do que x(char, char)para o primeiro argumento, pois intto inté uma correspondência exata e intto charé uma conversão. Mas x(int, int)é uma correspondência pior para o segundo argumento, porque é uma promoção em vez de uma correspondência exata. Portanto, nenhuma função é uma combinação melhor do que a outra e a sobrecarga não pode ser resolvida.