panggilan untuk berfungsi ambigu, tapi mengapa?
#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
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
i
parameter kei
-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 int
to int
adalah sama persis dan int
to char
adalah 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.