【发布时间】:2016-07-04 09:02:33
【问题描述】:
考虑简单的代码:
#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共享重载解析的代码吗?
【问题讨论】:
-
1:定义“不快乐”。 2:如果你删除
foo(int)会发生什么? -
@Amit unhappy 表示代码被拒绝,至于删除函数
foo(int),这不是问题的一部分,您可以自己尝试。 -
@AngelusMortis:VC++选择哪个函数?
标签: c++ overloading language-lawyer overload-resolution conversion-operator