Warum implizite Konvertierung Member-Funktionen der Arbeit von Rückgabetyp Überlastung, während es für die normalen Funktionen erlaubt?

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

Frage

C ++ erlaubt sich nicht, Polymorphismus für Methoden auf der Grundlage ihres Rückgabetyp. Wenn jedoch eine implizite Konvertierung Elementfunktion Überlastung scheint dies möglich.

Weiß jemand, warum? Ich dachte, Operatoren werden intern wie Methoden behandelt werden.

Edit: Hier ist ein Beispiel:

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
}
War es hilfreich?

Lösung

Conversion-Betreiber sind nicht wirklich anders Überlastungen betrachtet und sie werden als nicht auf ihr Rückgabetyp . Der Compiler wird sie nur verwenden, wenn es muss (wenn der Typ ist nicht kompatibel und soll umgewandelt werden) mit einem Cast-Operator einen von ihnen zu verwenden.

oder wenn explizit gefragt

Semantisch, was Ihr Code ist dabei mehrere verschiedene Typumwandlung Betreiber und nicht Überlastungen eines einzigen Betreibers zu erklären.

Andere Tipps

Das ist nicht Art zurück. Das ist Typumwandlung.

Bedenken Sie: func () erzeugt ein Objekt vom Typ Func. Es gibt keine Zweideutigkeit darüber, welche Methode (Konstruktor) wird aufgerufen werden.

Die einzige Frage, die bleibt, ist, ob es möglich ist, sie zu den gewünschten Typen zu werfen. Sie versehen die Compiler mit geeigneter Umwandlung, so dass er glücklich ist.

Es gibt nicht wirklich einen technischen Grund für die Ergebnistypen Überlastung von Funktionen zu verhindern. Dies ist in einigen Sprachen wie Ada zum Beispiel getan, aber im Zusammenhang mit C ++, die auch impliziten Konvertierungen haben (und zwei Arten von ihnen), wird die Nützlichkeit reduziert, und die Wechselwirkungen beiden Funktionen würden führen schnell zu Unklarheiten.

Beachten Sie, dass Sie die Tatsache, dass implizite Konvertierungen sind benutzerdefinierbare können Überlastung auf Ergebnistyp zu simulieren:

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

Die Überladungsauflösung wählt zwischen mehreren Kandidaten-Funktionen. In diesem Prozess wird der Rückgabetyp der Kandidaten in der Tat nicht berücksichtigt. im Falle der Umwandlung Betreiber ist jedoch die „Rückgabetyp“ von entscheidender Bedeutung bei der Bestimmung, ob die Betreiber ein Kandidat überhaupt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top