考慮簡單的代碼:重載決策具有多種功能和多種轉換操作符
#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++而鐺和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
^
任何人都可以解釋爲什麼上面的代碼失敗?還是它的bug?
還有一個問題:gcc和clang共享重載分辨率的代碼嗎?
1:定義「不快樂」。 2:如果刪除'foo(int)'會發生什麼? – Amit
@Amit不快樂意味着代碼被拒絕,並且至於刪除函數「foo(int)」,這不是問題的一部分,您可以自己嘗試。 –
@AngelusMortis:VC++選擇哪個函數? – davidhigh