wywołanie funkcji jest niejednoznaczne, ale dlaczego?

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

wywołanie „x” jest niejednoznaczne w kompilatorze Apple Clang, dlaczego?

dla x (int, int), pierwszy argument to bezpośrednie dopasowanie, a drugi to promocja dla x (char, char) pierwszy argument to standardowa konwersja, jak wiem, a także zgodnie z tą odpowiedzią-> https://stackoverflow.com/a/28184631/13023201

A promocja powinna być preferowana przed konwersją std, a następnie należy wywołać x (int, int). Więc dlaczego jest to niejednoznaczne?

Odpowiedzi

8 NathanPierson Dec 12 2020 at 15:51

Patrząc na, jak cppreference opisuje proces rozwiązywania przeciążeń:

Najlepsza funkcjonalna funkcja

Dla każdej pary wykonalnych funkcji F1 i F2 niejawne sekwencje konwersji od i-tego argumentu do i-tego parametru są uszeregowane w celu określenia, który z nich jest lepszy (z wyjątkiem pierwszego argumentu, niejawny argument obiektu dla statycznych funkcji składowych nie ma wpływu na zaszeregowanie)

F1 jest określona jako lepsza funkcja niż F2, jeśli niejawne konwersje dla wszystkich argumentów F1 niegorsze niż niejawne konwersje dla wszystkich argumentów F2, i

...

x(int, int)jest lepszym dopasowaniem niż x(char, char)dla pierwszego argumentu, ponieważ intto intjest dopasowaniem ścisłym, a intto charjest konwersją. Ale x(int, int)jest gorzej pasuje do drugiego argumentu, ponieważ jest to promocja zamiast ścisłego dopasowania. Zatem żadna z funkcji nie jest lepiej dopasowana niż druga i nie można rozwiązać problemu z przeciążeniem.