Freigeben über


Argumentübereinstimmung

Überladene Funktionen werden für die beste Übereinstimmung von Funktionsdeklarationen im aktuellen Bereich für 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 wurde gefunden.

  • Eine triviale Konvertierung wurde ausgeführt.

  • Eine ganzzahlige Heraufstufung wurde ausgeführt.

  • Eine Standardkonvertierung zum gewünschten Argumenttyp ist vorhanden.

  • Eine benutzerdefinierte Konvertierung (entweder Konvertierungsoperator oder Konstruktor) auf den gewünschten Argumenttyp ist vorhanden.

  • Es wurden durch Ellipsen dargestellte Argumente gefunden.

Der Compiler erstellt einen Satz Kandidatenfunktionen für jedes Argument. Kandidatenfunktionen sind Funktionen, in denen das tatsächliche Argument an dieser Position in den Typ des formalen Arguments konvertiert werden kann.

Ein Satz von "am besten passenden Funktionen" wird für jedes Argument erstellt, und die ausgewählte Funktion ist die Schnittmenge aller Sätze. Wenn die Schnittmenge mehr als eine Funktion enthält, ist das Überladen mehrdeutig und generiert einen Fehler. Die letztendlich ausgewählte Funktion stimmt stets besser überein als jede andere Funktion in der Gruppe für mindestens ein Argument. Wenn dies nicht der Fall ist (wenn kein klarer Gewinner vorhanden ist), generiert der Funktionsaufruf einen Fehler.

Berücksichtigen Sie die folgenden Deklarationen (Funktionen sind zur Identifikation der folgenden Erläuterung als Variant 1, Variant 2 und Variant 3 gekennzeichnet):

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 folgende Anweisung:

F1 = Add( F2, 23 );

Die vorhergehende Anweisung erstellt zwei Sätze:

Satz 1: Kandidatenfunktionen, deren erstes Argument vom Typ "fraction" ist

Satz 2: Kandidatenfunktionen, deren zweites Argument in den Typ "int" konvertiert werden kann

Variant 1

Variant 1 (int kann in long mithilfe einer Standardkonvertierung konvertiert werden)

Variant 3

 

Funktionen in Satz 2 sind Funktionen, für die es implizite Konvertierungen vom tatsächlichen Parametertyp in den formalen Parametertyp gibt. Unter diesen Funktionen gibt es eine Funktion mit den geringsten "Kosten" für die Konvertierung des tatsächlichen Parametertyps in den formalen Parametertyp.

Die Schnittmenge dieser beiden Sätze ist "Variant 1". Ein Beispiel für einen mehrdeutigen Funktionsaufruf ist:

F1 = Add( 3, 6 );

Der vorhergehende Funktionsaufruf erstellt die folgenden Sätze:

Satz 1: Kandidatenfunktionen, deren erstes Argument vom Typ "int" ist

Satz 2: Kandidatenfunktionen, deren zweites Argument vom Typ "int" ist

Variant 2 (int kann in long mithilfe einer Standardkonvertierung konvertiert werden)

Variant 1 (int kann in long mithilfe einer Standardkonvertierung konvertiert werden)

Beachten Sie, dass die Schnittmenge zwischen diesen beiden Sätzen leer ist. Aus diesem Grund generiert der Compiler eine Fehlermeldung.

Für die Argumentübereinstimmung wird eine Funktion mit n Standardargumenten als n+1 unterschiedliche Funktionen behandelt, jeweils mit einer anderen Anzahl von Argumenten.

Die Ellipse (...) dient als Platzhalter; sie stimmt mit jedem tatsächlichen Argument überein. Dies kann zu vielen mehrdeutigen Gruppen führen, wenn Sie die überladene Funktion nicht 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 im Code vorhanden sein dürfen, bis sie durch einen bestimmten Funktionsaufruf eindeutig deklariert werden.

Siehe auch

Referenz

Überladen