Können wir übermäßig zu belasten, basierend auf nur eine Funktion, ob ein Parameter einen Wert oder eine Referenz?
-
20-09-2019 - |
Frage
bekam ich die Antwort NEIN! Da vorbei Wert und vorbei Referenz Aussehen identisch mit dem Anrufer.
Der folgende Code kompiliert jedoch rechts
class A {
public:
void f(int i) {}
void f(int& i) {}
};
Aber wenn ich versuche, es zu benutzen, gibt es Compiler-Fehler.
int main () {
A a;
int i = 9;
int& j = i;
a.f(1);
a.f(i);
a.f(j);
return 0;
}
Warum nicht die Compiler deaktivieren es auch ohne zu wissen, es verwendet werden soll?
Lösung
Ja, sie können anhand von Referenz oder nicht überlastet werden. Deshalb ist es völlig in Ordnung, dass sie wie koexistieren zu haben; sie sind anders.
Das Problem hat mit Mehrdeutigkeit zu tun. Während f(1)
nur auf einer Variation bezeichnet werden kann, kann f(i)
auf beide genannt werden. Weder ist vorzuziehen, damit Sie einen Fehler für Mehrdeutigkeit bekommen. Wenn Sie eine dritte Funktion, foo (const int&)
hinzugefügt, alle Anrufe würden mehrdeutig sein. Aber alle sind nach wie vor Überlastungen von ihnen, und nicht in Konflikt.
Ich bin damit einverstanden es seltsam ist in der Lage sein, drei Überlastungen einer Funktion zu haben, und in der Lage sein, direkt keine nennen. Vielleicht jemand anderes mehr hat hinzuzufügen.
Andere Tipps
Sie können jede Methode aufrufen:
void (A::*t)(int& ) =&A::f;
A a;
int i = 9;
int& j = i;
a.f(1); // f(int i)
(a.*t)(i); // f(int& i)