Рассмотрим простой код:разрешение перегрузки с множеством функций и нескольких операторов преобразования
#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, лязг и 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++ счастлив с кодом, а лязг и НКУ недовольны выше кодом.
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 общий код разрешения перегрузки?
1: Определите «несчастливые». 2: Что произойдет, если вы удалите 'foo (int)'? – Amit
@Amit unhappy означает, что код отклоняется, а что касается удаления функции 'foo (int)', это не вопрос, вы можете попробовать его сами, пожалуйста. –
@AngelusMortis: какая функция VC++ выбирает? – davidhigh