Sdílet prostřednictvím


Argument shoda

Přetížená funkce jsou vybrány pro nejlepší shoda deklarace funkce v aktuálním oboru pro argumenty zadané ve volání funkce.Pokud je nalezen vhodný funkce, funkce se nazývá. "Vhodné"v tomto kontextu znamená jeden z následujících:

  • Byla nalezena přesná shoda.

  • Trivial Převod byl proveden.

  • Integrální podpora byla provedena.

  • Standardního převodu typu požadovaný argument existuje.

  • Uživatelem definovaný převod (převod operátor nebo konstruktoru) na požadovaný argument typ existuje.

  • Argumenty, které jsou reprezentovány Výpustek nebyly nalezeny.

Kompilátor vytvoří sadu kandidátské země/oblast pro každý argument funkce.Kandidát funkce jsou funkce, ve kterých skutečné argument v této poloze lze převést na typ formální argument.

Sada "nejlépe odpovídající funkce" je vytvořena pro každý argument a vybrané funkce je průsečík všech sad.Pokud průsečíku obsahuje více než jednu funkci, přetížení je dvojznačný a generuje chybu.Nakonec vybrané funkce je vždy lepší než všechny ostatní funkce ve skupině odpovídající alespoň jeden argument.Pokud není případ (pokud neexistuje žádný jasný Vítěz), volání funkce generuje chybu.

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

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ředcházející příkaz vytvoří dvě sady:

Sada 1: Kandidát funkce, které mají první Argument typ zlomku

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

Varianty 1

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

Varianty 3

 

Funkce nastavit 2 jsou funkce, které jsou implicitní převod typu skutečný parametr typu parametru a mezi takové funkce je funkce, pro které je nejmenší "náklady" skutečný parametr typ převodu na jeho typu parametru.

Průsečík těchto dvou sad je varianty 1.Je například volání funkce nejednoznačné:

F1 = Add( 3, 6 );

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

Sada 1: Kandidát funkcí, že jste první Argument typu int

Sada 2: Kandidát funkce, že jste druhý Argument typu int

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

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

Všimněte si, že Průsečík těchto dvou množin je prázdný.Proto kompilátor vygeneruje chybovou zprávu.

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

Tři tečky (...) slouží jako zástupný znak; odpovídá jakékoli skutečné argument.To může vést k mnoha dvojznačný sady, pokud není návrh sady přetížené funkce s mimořádnou pozorností.

[!POZNÁMKA]

Nejasnost přetížené funkce nelze určit až do volání funkce.V daném okamžiku sady jsou postaveny pro každý argument ve volání funkce a zjistit, zda existuje jednoznačné přetížení.To znamená, že dvojznačnosti zůstat v kódu dokud jim jsou evoked určité funkce volání.

Viz také

Referenční dokumentace

Přetěžování