Argument dopasowania
Funkcji zastąpionej zostały wybrane dla najlepszego dopasowania deklaracje funkcji z bieżącego zakresu do argumenty podane w wywołaniu funkcji.Jeśli zostanie znaleziony odpowiednich funkcji, że funkcja jest wywoływana. "Odpowiednie"w tym kontekście oznacza jedną z następujących czynności:
Znaleziono dopasowanie dokładne.
Wykonano trivial konwersji.
Promocja integralną została wykonana.
Istnieje standardowy konwersji na typ żądanego argumentu.
Zdefiniowane przez użytkownika konwersja (konwersji operatora lub konstruktora) na typ argumentu pożądanych istnieje.
Znaleziono argumenty reprezentowane przez wielokropek.
Kompilator tworzy zestaw kandydat funkcje dla każdego argumentu.Funkcje kandydat są funkcje, w których rzeczywiste argument w tym miejscu można konwertować na typ argument formalny.
Zestaw "najlepsze dopasowanie funkcje" jest przeznaczony dla każdego argumentu i funkcji wybranych jest punktem przecięcia wszystkich zestawów.Punkt przecięcia zawiera więcej niż jedną funkcję, przeciążenie jest niejednoznaczny i generuje błąd.Dopasowane lepiej niż każdej funkcji w grupie co najmniej jeden argument jest zawsze funkcję, która ostatecznie jest zaznaczone.Jeśli nie jest to przypadek (jeśli istnieje wyraźne zwycięzcy), wywołanie funkcji generuje błąd.
Należy wziąć pod uwagę następujące deklaracje (funkcje są oznaczone Variant 1, Variant 2, i Variant 3, do identyfikacji w następstwie 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ące oświadczenie:
F1 = Add( F2, 23 );
Instrukcja poprzedniego tworzy dwa zestawy:
Zestaw 1: Kandydat funkcje, które mają pierwszy Argument ułamek typu |
Zestaw 2: Kandydat funkcje Whose drugi Argument mogą być konwertowane na typ int |
---|---|
Wariant 1 |
Wariant 1 (int mogą być konwertowane na long przy użyciu standardowych konwersji) |
Wariant 3 |
|
Funkcje w ustawić 2 są funkcje, dla którego są konwersje niejawne z typem parametru rzeczywiste formalny typ parametru i wśród takich funkcji jest funkcja, dla którego jest najmniejszym "koszt" konwersji typu parametru rzeczywistego jego formalny typ parametru.
Punkt przecięcia tych dwóch zestawów jest wariant 1.Przykładem wywołanie funkcji niejednoznaczne jest:
F1 = Add( 3, 6 );
Poprzedniego wywołania funkcji buduje następujących zestawów:
Zestaw 1: Kandydat funkcje że mają pierwszego argumentu typu int |
Zestaw 2: Kandydat funkcje że mają drugiego argumentu typu int |
---|---|
Wariant 2 (int mogą być konwertowane na long przy użyciu standardowych konwersji) |
Wariant 1 (int mogą być konwertowane na long przy użyciu standardowych konwersji) |
Należy zauważyć, że punkt przecięcia między dwoma zestawami jest pusty.W związku z tym kompilator generuje komunikat o błędzie.
Dla argumentu dopasowanie, funkcja z n argumenty domyślne jest traktowany jako nfunkcje oddzielne + 1, każdy z inną liczbą argumentów.
Akty wielokropek (...) jako symbolu wieloznacznego; Dopasowuje dowolny z argumentów rzeczywiste.Może to prowadzić do wielu zestawów niejednoznaczne, jeśli nie zaprojektujesz zestawy funkcji zastąpionej z ostrożnością.
[!UWAGA]
Nie można ustalić niejednoznaczności przeciążonej funkcji, aż do wywołania funkcji.W tym punkcie zestawy są zbudowane dla każdego argumentu w wywołaniu funkcji i można określić, czy istnieje jednoznaczny przeciążenia.Oznacza to, że dopóki nie są one przywołane przez wywołanie funkcji określonej niejasności może pozostać w kodzie.