¿Por qué hacer la conversión implícita de funciones miembro de la sobrecarga de trabajo por tipo de retorno, mientras que no está permitido para el funcionamiento normal?

StackOverflow https://stackoverflow.com/questions/1128501

Pregunta

C++ no permite el polimorfismo para los métodos basados en su tipo de retorno.Sin embargo, cuando la sobrecarga de una conversión implícita de la función miembro esto parece posible.

¿Alguien sabe por qué?Yo pensaba que los operadores son manejadas como métodos internamente.

Editar:He aquí un ejemplo:

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
}
¿Fue útil?

Solución

Los operadores de conversión no se consideran realmente diferentes sobrecargas y no se les llama basan en su tipo de retorno . El compilador sólo los utilizará cuando tiene que (cuando el tipo es incompatible y debe ser convertido) o cuando se le preguntó explícitamente para utilizar uno de ellos con un operador de conversión.

punto de vista semántico, lo que su código está haciendo es declarar varios operadores diferente Tipo de conversión y no sobrecargas de un solo operador .

Otros consejos

Eso no retorno tipo. Esa es la conversión de tipos.

Considere: func () crea un objeto de tipo func. No hay ninguna ambigüedad en cuanto a qué método (constructor) será invocado.

La única cuestión que queda es si es posible echarlo a los tipos deseados. Que ya ha proporcionado el compilador con la conversión apropiada, por lo que es feliz.

En realidad no hay una razón técnica para evitar la sobrecarga de las funciones de los tipos de resultados. Esto se hace en algunos lenguajes como Ada, por ejemplo, pero en el contexto de C ++ que también tiene las conversiones implícitas (y la clase dos de ellos), se reduce la utilidad y las interacciones de las dos características sería conduce rápidamente a ambigüedades.

Tenga en cuenta que puede utilizar el hecho de que las conversiones implícitas son definibles para simular una sobrecarga en el tipo de resultado de usuario:

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"; }
};

resolución de sobrecarga elige entre varias funciones candidatas. En este proceso, el tipo de retorno de los candidatos es de hecho no se considera. Sin embargo, en el caso de los operadores de conversión del "tipo de retorno" es críticamente importante para determinar si ese operador es un candidato en absoluto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top