Warum implizite Konvertierung Member-Funktionen der Arbeit von Rückgabetyp Überlastung, während es für die normalen Funktionen erlaubt?
-
13-09-2019 - |
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
}
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 gefragtSemantisch, 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.