l'appel à la fonction est ambigu, mais pourquoi?

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; 
}

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

8 NathanPierson Dec 12 2020 at 15:51

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 au i-è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 intto intest une correspondance exacte et intto charest 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.