Sdílet prostřednictvím


Porovnávání argumentů

Přetížené funkce jsou vybrány tak, aby nejlépe odpovídaly deklaracím funkcí v aktuálním oboru pro argumenty zadané ve volání funkce.Je-li nalezena vhodná funkce, je tato funkce zavolána. "Vhodná" v tomto kontextu znamená některou z následujících:

  • Byla nalezena přesná shoda.

  • Byl proveden triviální převod.

  • Byla provedena Integrální propagace.

  • Existuje standardní převod na typ požadovaného argumentu.

  • Existuje uživatelem definovaný převod (operátor převodu nebo konstruktor) na požadovaný typ argumentu.

  • Byly nalezeny argumenty představované třemi tečkami.

Kompilátor vytvoří sadu kandidátských funkcí pro každý argument.Kandidátské funkce jsou funkce, ve kterých může být argument na dané pozici převeden na typ formálního argumentu.

Sada "nejlépe odpovídajících funkcí" je vytvořena pro každý argument a vybrané funkce představují průnik všech sad.Pokud průnik obsahuje více než jednu funkci, přetížení má dvojí význam a dojde k chybě.Funkce, která je nakonec vybrána představuje vždy lepší shodu než všechny ostatní funkce ve skupině pro alespoň jeden argument.Nejedná-li se o tento případ (není žádný jasný vítěz), volání funkce generuje chybu.

Zvažte následující deklarace (funkce jsou pro identifikaci v následující diskuzi označeny Variant 1, Variant 2 a Variant 3):

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;

Zvažte následující příkaz:

F1 = Add( F2, 23 );

Předchozí příkaz sestaví dvě sady:

Sada 1: Kandidátské funkce, které mají první Argument typu Fraction

Sada 2: Kandidátské funkcí jejichž druhý Argument lze převést na typ int

Variant 1

Variant 1 (int lze převést na long pomocí standardního převodu)

Variant 3

 

Funkce v sadě 2 jsou funkce, pro které existují implicitní převody z typu aktuálního parametru na typ formálního parametru a mezi takovými funkcemi je funkce, pro kterou je "cena" převodu typu parametru na její formální typ parametru nejnižší.

Průnik těchto dvou sad je Variant 1.Příkladem volání dvojznačné funkce je:

F1 = Add( 3, 6 );

Předchozí volání funkce sestaví následující sady:

Sada 1: Kandidátské funkce, které mají první argument typu int

Sada 2: Kandidátské funkce, které mají druhý argument typu int

Variant 2 (int lze převést na long pomocí standardního převodu)

Variant 1 (int lze převést na long pomocí standardního převodu)

Všimněte si, že je průnik mezi těmito dvěma sadami prázdný.Proto kompilátor vygeneruje chybovou zprávu.

Pro odpovídající argumenty je funkce s n výchozími argumenty považována za n+1 samostatných funkcí, kde každá má jiný počet argumentů.

Tři tečky (...) slouží jako zástupný znak. Odpovídají jakémukoli argumentu.Nejsou-li přetížené funkce pečlivě navrženy, může to vést k mnoha dvojznačným sadám.

[!POZNÁMKA]

Nejednoznačnost přetížených funkcí nelze určit, dokud nedojde k volání funkce.V tomto okamžiku jsou vytvořeny sady pro každý argument ve volání funkce a lze zjistit, zda existuje nejednoznačné přetížení.To znamená, že nejednoznačnosti mohou zůstat v kódu, dokud nejsou vyvolány pomocí volání funkce.

Viz také

Referenční dokumentace

Přetížení