6

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

4 回答 4

11

转换运算符并没有真正被认为是不同的重载,它们不是根据它们的返回类型调用的调用的。编译器只会在必要时使用它们(当类型不兼容并且应该转换时)或者当明确要求将它们之一与强制转换运算符一起使用时。

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

于 2009-07-14T22:58:18.223 回答
3

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

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

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

于 2009-07-14T22:56:40.177 回答
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"; }
};
于 2009-07-15T13:00:48.140 回答
0

重载解决方案在多个候选函数之间进行选择。在这个过程中,确实没有考虑候选者的返回类型。但是,在转换运算符的情况下,“返回类型”对于确定该运算符是否是候选者至关重要。

于 2009-07-15T11:53:32.237 回答