chamada para função é ambígua, mas por quê?
#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
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 parai
-é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 int
to int
é uma correspondência exata e int
to 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.