panggilan untuk berfungsi ambigu, tapi mengapa?

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

panggilan ke 'x' ambigu dalam kompiler clang apel, mengapa?

untuk x (int, int), argumen pertama adalah pertandingan langsung dan kedua adalah promosi untuk x (char, char) argumen pertama adalah konversi standar yang saya ketahui dan juga menurut jawaban ini-> https://stackoverflow.com/a/28184631/13023201

Dan promosi harus lebih disukai daripada konversi std, lalu x (int, int) harus dipanggil. Lalu kenapa ini ambigu ??

Jawaban

8 NathanPierson Dec 12 2020 at 15:51

Melihat bagaimana cppreference mendeskripsikan proses resolusi kelebihan beban:

Fungsi terbaik yang layak

Untuk setiap pasangan dari fungsi yang layak F1 dan F2, urutan konversi implisit dari iparameter ke i-th ke -th diberi peringkat untuk menentukan mana yang lebih baik (kecuali argumen pertama, argumen objek implisit untuk fungsi anggota statis tidak berpengaruh pada peringkat)

F1 ditentukan sebagai fungsi yang lebih baik daripada F2 jika konversi implisit untuk semua argumen F1 tidak lebih buruk dari konversi implisit untuk semua argumen F2, dan

...

x(int, int)lebih cocok daripada x(char, char)untuk argumen pertama, karena intto intadalah sama persis dan intto charadalah konversi. Tetapi x(int, int)adalah lebih buruk cocok untuk argumen kedua, karena itu promosi bukannya sama persis. Jadi tidak ada fungsi yang lebih cocok dari yang lain dan kelebihan beban tidak dapat diselesaikan.