Рассмотрим простой код:
#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);
}
Приведенный выше код работает нормально, и, как и ожидалось, gcc, clang и VC++ выбирают foo(char)
.
Теперь давайте немного изменим код:
#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);
}
Теперь это должно было выбрать foo(double)
, но кажется, что только VC++ доволен кодом, в то время как clang и gcc недовольны приведенным выше кодом.
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
^
Может ли кто-нибудь объяснить, почему приведенный выше код не работает? или это баг?.
Еще один вопрос: есть ли у gcc и clang общий код разрешения перегрузок?
foo(int)
? - person Amit   schedule 17.03.2016foo(int)
, это не является частью вопроса, вы можете попробовать это сами, пожалуйста. - person Angelus Mortis   schedule 17.03.2016