为什么隐式转换成员函数的返回类型超载工作,而这是不允许的正常功能?
-
13-09-2019 - |
题
C ++不允许多态性基于它们返回类型的方法。然而,过载的隐式转换部件功能时,这似乎可能的。
有谁知道为什么吗?我以为操作人员等在内部的方法来处理。
编辑:这是一个例子:
struct func {
operator string() { return "1";}
operator int() { return 2; }
};
int main( ) {
int x = func(); // calls int version
string y = func(); // calls string version
double d = func(); // calls int version
cout << func() << endl; // calls int version
}
解决方案
转换运营商都没有真正考虑过不同的重载和他们不叫基础上的的返回类型的。编译器将只使用它们时,它的具有强>(当类型是不兼容,应该被转换),或当明确要求使用它们中的一个与转换运算符。
在语义上,你的代码是做是声明几个的不同强>类型转换运算符和不是一个单一的操作者的重载强>
其他提示
这不是返回类型。这是类型转换。
考虑:函数()创建类型FUNC的对象。没有歧义,以什么方法(构造器)将被调用。
这仍然唯一的问题是,如果有可能将它转换为所期望的类型。你设置有适当的转换编译器,因此它是高兴。
有是不是一个真正的技术原因,以防止职能上的结果类型超载。这在像Ada的一些语言,例如完成的,但在C ++的这也隐式转换(和两种人)的情况下,效用降低,两者的综合特性的相互作用会很快导致歧义。
请注意,可以使用以下事实:隐式转换是用户可定义的,以模拟在过载的结果类型:
class CallFProxy;
CallFProxy f(int);
class CallFProxy {
int myParameter;
CallFProxy(int i) : myParameter(i) {}
public:
operator double() { std::cout << "Calling f(int)->double\n"; return myParameter; }
operator string() { std::cout << "Calling f(int)->string\n"; return "dummy"; }
};
过载的分辨率的多个候选的功能之间选择。在这个过程中,考生的返回类型的确没有考虑。然而,在转换操作符的情况下,“返回类型”是决定运营商是否是候选人都非常重要。
不隶属于 StackOverflow