l'appel à la fonction est ambigu, mais pourquoi?
#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;
}
l'appel à «x» est ambigu dans le compilateur Apple Clang, pourquoi?
pour x (int, int), le premier argument est une correspondance directe et le second est une promotion pour x (char, char) Le premier argument est une conversion standard comme je le sais et aussi selon cette réponse-> https://stackoverflow.com/a/28184631/13023201
Et la promotion doit être préférée à la conversion standard, puis x (int, int) doit être appelé. Alors pourquoi est-ce ambigu ??
Réponses
En regardant comment cppreference décrit le processus de résolution de surcharge:
Meilleure fonction viable
Pour chaque paire de fonctions viables F1 et F2, les séquences de conversion implicites du
i
-ème argument aui
-ème paramètre sont classées pour déterminer laquelle est la meilleure (sauf le premier argument, l' argument d'objet implicite pour les fonctions membres statiques n'a aucun effet sur le classement)F1 est déterminé comme étant une meilleure fonction que F2 si les conversions implicites pour tous les arguments de F1 ne sont pas pires que les conversions implicites pour tous les arguments de F2, et
...
x(int, int)
est une meilleure correspondance que x(char, char)
pour le premier argument, car int
to int
est une correspondance exacte et int
to char
est une conversion. Mais x(int, int)
c'est une pire correspondance pour le deuxième argument, car c'est une promotion au lieu d'une correspondance exacte. Ainsi, aucune fonction ne correspond mieux que l'autre et la surcharge ne peut pas être résolue.