簡単なコードを考えてみましょう:
#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);
}
これで choose が必要になりましたが、 clang と gccが上記のコードに満足していないのに対し、 VC++foo(double)
だけがこのコードに満足しているようです。
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
^
上記のコードが失敗する理由を誰か説明できますか? それともバグですか?
もう 1 つの質問: gcc と clang はオーバーロード解決のコードを共有していますか?