为什么隐式转换成员函数重载按返回类型工作,而普通函数不允许这样做?

时间:2009-07-14 22:48:05

标签: c++ polymorphism implicit-conversion

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
}

4 个答案:

答案 0 :(得分:11)

转换运算符实际上并不被视为不同的重载,并且不会基于返回类型调用它们。编译器只会在必须(当类型不兼容且应该转换时)或明确要求将其中一个与强制转换运算符一起使用时使用它们。

从语义上讲,您的代码所做的是声明几个不同的类型转换运算符,不是单个运算符的重载

答案 1 :(得分:3)

那不是返回类型。这是类型转换。

考虑:func()创建一个func类型的对象。关于调用什么方法(构造函数)没有歧义。

剩下的唯一问题是是否可以将其转换为所需的类型。您为编译器提供了适当的转换,因此很高兴。

答案 2 :(得分:1)

实际上没有技术理由可以防止结果类型上的函数过载。这在一些语言中完成,例如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"; }
};

答案 3 :(得分:0)

重载分辨率在多个候选函数之间进行选择。在这个过程中,确实没有考虑候选人的返回类型。但是,在转换运算符的情况下,“返回类型”在确定该运算符是否完全是候选者时至关重要。