#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;
}
вызов «x» неоднозначен в компиляторе apple clang, почему?
для x(int,int) первый аргумент — это прямое совпадение, а второй — продвижение для x(char, char) первый аргумент является стандартным преобразованием, как я знаю, а также в соответствии с этим ответом-> https://stackoverflow.com/a/28184631/13023201
И продвижение должно быть предпочтительнее стандартного преобразования, тогда следует вызвать x (int, int). Тогда почему это двусмысленно??
Посмотрите, как cppreference описывает процесс разрешения перегрузки:
Лучшая жизнеспособная функция
Для каждой пары жизнеспособных функций F1 и F2 последовательности неявного преобразования из
i
-го аргумента вi
-й параметр ранжируются, чтобы определить, какой из них лучше (за исключением первого аргумента, неявный объектный аргумент для статических функций-членов не имеет эффекта в рейтинге)F1 считается лучшей функцией, чем F2, если неявные преобразования для всех аргументов F1 не хуже, чем неявные преобразования для всех аргументов F2, и
...
x(int, int)
лучше подходит, чем x(char, char)
для первого аргумента, так как int
в int
является точным совпадением, а int
в char
является преобразованием. Но x(int, int)
хуже соответствует второму аргументу, потому что это повышение, а не точное совпадение. Таким образом, ни одна из функций не подходит лучше, чем другая, и перегрузка не может быть устранена.