wywołanie funkcji jest niejednoznaczne, ale dlaczego?
#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
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 doi
-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 nie są gorsze niż niejawne konwersje dla wszystkich argumentów F2, i
...
x(int, int)
jest lepszym dopasowaniem niż x(char, char)
dla pierwszego argumentu, ponieważ int
to int
jest dopasowaniem ścisłym, a int
to char
jest 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.