Considerate codice semplice:risoluzione di sovraccarico con molteplici funzioni e molteplici operatori di conversione
#include<iostream>
struct A {
operator double(){
std::cout<<"Conversion function double chosen."<<std::endl;
return 1.1;
}
operator char(){
std::cout<<"Conversion function char chosen."<<std::endl;
return 'a';
}
} a;
void foo(int){}
void foo (char){}
int main() {
foo(a);
}
Sopra codice funziona bene, e come previsto gcc, clang e VC++ sceglie foo(char)
.
Ora consente di modificare il codice po ':
#include<iostream>
struct A {
operator double(){
std::cout<<"Conversion function double chosen."<<std::endl;
return 1.1;
}
operator char(){
std::cout<<"Conversion function char chosen."<<std::endl;
return 'a';
}
} a;
void foo(int){}
void foo (double){} //parameter changed from char to double
int main() {
foo(a);
}
Ora questo dovrebbe avere scegliere foo(double)
, ma sembra solo VC++ è felice con il codice mentre clang e gcc sono infelici con il codice di cui sopra.
main.cpp:11:10: error: call of overloaded 'foo(A&)' is ambiguous
foo(a);
^
main.cpp:8:6: note: candidate: void foo(int)
void foo(int){}
^
main.cpp:9:6: note: candidate: void foo(double)
void foo (double){} //parameter changed from char to double
^
Qualcuno può spiegare perché il codice di cui sopra non riesce? o è un bug?
Un'altra domanda: codice di condivisione gcc e clang della risoluzione di sovraccarico?
1: definire "infelice". 2: Cosa succede se rimuovi 'foo (int)'? – Amit
@Amit il codice di mezzo infelice viene rifiutato, e come per la rimozione della funzione 'pippo (int)', non fa parte della domanda, puoi provarlo tu stesso per favore. –
@AngelusMortis: quale funzione sceglie VC++? – davidhigh