вызов функции неоднозначен, но почему?

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

вызов 'x' неоднозначен в компиляторе apple clang, почему?

для x (int, int) первый аргумент является прямым совпадением, а второй - продвижением для x (char, char), первый аргумент является стандартным преобразованием, как я знаю, а также в соответствии с этим ответом-> https://stackoverflow.com/a/28184631/13023201

И продвижение должно быть предпочтительнее стандартного преобразования, тогда следует вызвать x (int, int). Тогда почему это неоднозначно ??

Ответы

8 NathanPierson Dec 12 2020 at 15:51

Посмотрите, как cppreference описывает процесс разрешения перегрузки:

Лучшая жизнеспособная функция

Для каждой пары жизнеспособных функций F1 и F2 неявные последовательности преобразования из i-го аргумента в i-й параметр ранжируются, чтобы определить, какая из них лучше (кроме первого аргумента, неявный объектный аргумент для статических функций-членов не влияет на рейтинг)

F1 определяется как лучшая функция, чем F2, если неявные преобразования для всех аргументов F1 не хуже, чем неявные преобразования для всех аргументов F2, и

...

x(int, int)является лучшим совпадением, чем x(char, char)первый аргумент, поскольку intto int- точное совпадение, а intto char- преобразование. Но x(int, int)это худшее совпадение для второго аргумента, потому что это продвижение, а не точное совпадение. Таким образом, ни одна функция не подходит лучше, чем другая, и перегрузка не может быть устранена.