Udostępnij za pośrednictwem


Dopasowywanie argumentów

Przeciążone funkcje są wybierane dla najlepszego dopasowania deklaracji funkcji w bieżącym zakresie do argumentów dostarczonych w wywołaniu funkcji.Jeśli zostanie znaleziona odpowiednia funkcja, jest ona wywoływana. W tym kontekście "pasująca" może oznaczać:

  • Znaleziono dokładne dopasowanie.

  • Wykonano trywialną konwersję.

  • Wykonano promocję typu całkowitego.

  • Istnieje standardowa konwersja do pożądanego typu argumentu.

  • Istnieje zdefiniowana przez użytkownika konwersja (operator konwersji lub konstruktor) do pożądanego typu argumentu.

  • Znaleziono argumenty reprezentowane wielokropkiem.

Kompilator tworzy zestaw funkcji kandydujących dla każdego argumentu.Funkcje kandydujące są funkcjami, w których rzeczywisty argument w tej pozycji można konwertować na formalny typ argumentu.

Zestaw "najlepiej dopasowanych funkcji" jest tworzony dla każdego argumentu, a wybrana funkcja jest punktem przecięcia wszystkich zestawów.Jeśli punkt przecięcia zawiera więcej niż jedną funkcję, przeciążenie jest niejednoznaczne i generuje błąd.Funkcja, która zostanie ostatecznie wybrana jest zawsze dopasowana lepiej niż każda inna funkcja w grupie dla co najmniej jednego argumentu.Jeśli tak się nie stanie, (jeśli nie ma jednoznacznego zwycięzcy), wywołanie funkcji generuje błąd.

Należy wziąć pod uwagę następujące deklaracje (funkcje są oznaczone jako Variant 1, Variant 2 i Variant 3 do identyfikacji w poniższej dyskusji):

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;

Należy wziąć pod uwagę następującą instrukcję:

F1 = Add( F2, 23 );

Poprzednia instrukcja tworzy dwa zestawy:

Zestaw 1: Funkcje kandydujące, które mają pierwszy argument typu ułamkowego

Zestaw 2: Funkcje kandydujące, których drugi argument może zostać konwertowany na typ int

Variant 1

Variant 1 (int może zostać konwertowany na long za pomocą konwersji standardowej)

Variant 3

 

Funkcje w zestawie 2 są funkcjami, dla których istnieją niejawne konwersje z rzeczywistego typu parametru na formalny typ parametru, a wśród takich funkcji jest funkcja, dla której "koszt" konwersji rzeczywistego typu parametru do jego formalnego typu parametru jest najmniejszy.

Na przecięciu tych dwóch zestawów jest Variant 1.Przykładem niejednoznacznego wywołania funkcji jest:

F1 = Add( 3, 6 );

Poprzednie wywołanie funkcji tworzy następujące zestawy:

Zestaw 1: Funkcje kandydujące, które mają pierwszy argument typu int

Zestaw 2: Funkcje kandydujące, które mają drugi argument typu int

Variant 2 (int może zostać konwertowany na long za pomocą konwersji standardowej)

Variant 1 (int może zostać konwertowany na long za pomocą konwersji standardowej)

Należy zauważyć, że punkt przecięcia między tymi dwoma zestawami jest pusty.W związku z tym, kompilator generuje komunikat o błędzie.

Dla dopasowywania argumentów, funkcja z n domyślnych argumentów jest traktowana jako n+1 oddzielnych funkcji.

Wielokropek (...) zachowuje się jak symbol wieloznaczny; pasuje do każdego rzeczywistego argumentu.Może to prowadzić do wielu niejednoznacznych zestawów, jeśli zestawy przeciążonych funkcji nie zostaną zaprojektowane ze szczególną starannością.

[!UWAGA]

Niejednoznaczności przeciążonych funkcji nie można określić, aż do napotkania wywołania funkcji.W tym momencie, dla każdego argumentu w wywołaniu funkcji budowane są zestawy i można określić, czy istnieje jednoznaczne przeciążenie.Oznacza to, że niejasności mogą pozostać w kodzie, dopóki nie są one przywołane przez określone wywołanie funkcji.

Zobacz też

Informacje

Przeciążenie