Argument-Abgleichen
Überladene Funktionen werden für die beste Übereinstimmung von Funktionsdeklarationen im aktuellen Bereich auf Argumente ausgewählt, die im Funktionsaufruf angegeben werden.Wenn eine passende Funktion gefunden wird, wird diese Funktion aufgerufen. "Passend“ in diesem Kontext bedeutet Folgendes:
Ein exakte Übereinstimmung gefunden wurde.
Eine triviale Konvertierungen wurde ausgeführt.
Eine ganzzahlige Heraufstufung wurde ausgeführt.
Eine Standardkonvertierung auf die gewünschte Argumenttyp vorhanden ist.
Eine benutzerdefinierte Konvertierung (entweder Konvertierungsoperator oder des Konstruktors) auf die gewünschte Argumenttyp vorhanden ist.
Die Argumente, die von Ellipsen dargestellt wurden, wurden gefunden.
Der Compiler erstellt einen Satz von möglichen Funktionen für jedes Argument.möglichen Funktionen sind Funktionen, mit denen der Parameter an dieser Position in den Typ des formalen Argument konvertiert werden kann.
Ein Satz von „am besten passende Funktionen“ wird für jedes Argument erstellt, und die ausgewählte Funktion ist die Schnittmenge aller legt diesen fest.Wenn die Schnittmenge mehr als eine Funktion enthält, ist das Überladen mehrdeutig und generiert einen Fehler.Die Funktion, die schließlich ausgewählt ist, ist immer eine bessere Übereinstimmung für jede andere Funktion in der Gruppe für mindestens ein Argument.Wenn dies nicht der Fall ist (wenn kein klaren Gewinner vorhanden ist), wird der Funktionsaufruf einen Fehler.
Berücksichtigen Sie die folgenden Deklarationen (Funktionen sind als Variant 1, Variant 2und Variant 3, zur Identifikation der folgenden Erläuterung):
Fraction &Add( Fraction &f, long l ); // Variant 1
Fraction &Add( long l, Fraction &f ); // Variant 2
Fraction &Add( Fraction &f, Fraction &f ); // Variant 3
Fraction F1, F2;
Betrachten Sie die folgende Anweisung aus:
F1 = Add( F2, 23 );
Die vorangehenden zwei Sätze von Multiprozessorbuilds Anweisung:
Satz 1: Kandidaten-Funktionen, die erstes Argument vom Typ-Bruchs haben |
Satz 2: Kandidaten-Funktionen, dessen zweites Argument an den int-Typ konvertiert werden kann |
---|---|
Variante 1 |
Variante 1 (int kann auf long mithilfe einer Standardkonvertierung konvertiert werden) |
Variante 3 |
|
Funktionen in Reihe 2 sind Features für die implizite Konvertierungen vom tatsächlichen Parametertyp in den formalen Parametertyp und mit diesen Funktionen gibt, gibt es eine Funktion, für die die „Kosten“ zum Konvertieren des tatsächlichen Parametertyps an den formalen Parametertyp die kleinste sind.
Die Schnittmenge der beiden Sätze ist variantes 1.Ein Beispiel für einen mehrdeutigen Funktionsaufruf ist:
F1 = Add( 3, 6 );
Im obigen Funktionsaufruf erstellt die folgenden Sätze:
Satz 1: Kandidaten-Funktionen, die erstes Argument vom int-Typs haben |
Satz 2: Kandidaten-Funktionen, die zweites Argument des int-Typs haben |
---|---|
Variante 2 (int kann auf long mithilfe einer Standardkonvertierung konvertiert werden) |
Variante 1 (int kann auf long mithilfe einer Standardkonvertierung konvertiert werden) |
Beachten Sie, dass die Schnittmenge zwischen diesen beiden Sätzen leer ist.Daher generiert der Compiler eine Fehlermeldung.
Für abgleichende Argument ist eine Funktion der n-Standard , während argumenten n+1Funktionen trennen, jedes durch eine andere Anzahl von Argumenten behandelt.
Die Auslassungszeichen (...) treten als Platzhalter auf. entspricht einem beliebigen sie übergebenen Parameter ab.Dies kann zu viele mehrdeutigen führen legt sie fest, wenn Sie keine Sätze von überladenen Funktion mit größter Sorgfalt entwerfen.
Hinweis |
---|
Mehrdeutigkeit von überladenen Funktionen kann nicht bestimmt werden, bis ein Funktionsaufruf gefunden wird.An diesem Punkt werden die Sätze für jedes Argument im Funktionsaufruf erstellt, und Sie können bestimmen, ob eine eindeutige Überladung vorhanden ist.Dies bedeutet, dass Mehrdeutigkeiten in Code sein können, bis sie durch einen bestimmten Funktionsaufruf erwähnt werden. |