Können wir übermäßig zu belasten, basierend auf nur eine Funktion, ob ein Parameter einen Wert oder eine Referenz?

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

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?

War es hilfreich?

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)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top