Corrispondenza dell'argomento

Le funzioni in overload vengono selezionate per la corrispondenza migliore delle dichiarazioni di funzione nell'ambito corrente agli argomenti forniti nella chiamata di funzione.Se una funzione appropriata viene trovata, tale funzione viene chiamata. Appropriato„ in questo contesto indica una delle seguenti operazioni:

  • Una corrispondenza esatta è stata trovata.

  • Una conversione semplice è stata eseguita.

  • La promozione integrali è stata eseguita.

  • Una conversione standard al tipo di argomento richiesto esiste.

  • Una conversione definita dall'utente (operatore o costruttore di conversione) al tipo di argomento richiesto esiste.

  • Gli argomenti rappresentati dai puntini di sospensione sono stati trovati.

Il compilatore crea un set di funzioni candidate per ciascun argomento.Le funzioni candidate sono funzioni in cui effettivo argomento in tale percorso può essere convertito nel tipo dell'argomento formale.

Un set di “migliori funzioni corrispondenti„ viene compilato per ogni argomento e la funzione selezionata è l'intersezione di tutti i set.Se l'intersezione contiene più di una funzione, overload è ambigua e genera un errore.La funzione che verrà selezionata è sempre una migliore corrispondenza di qualsiasi altra funzione nel gruppo per almeno un argomento.In caso contrario (se non c " è chiaro vinto), la chiamata di funzione genera un errore.

Considerare le seguenti dichiarazioni (funzioni sono contrassegnate Variant 1, Variant 2e Variant 3, per l'identificazione nella discussione seguente):

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;

Si consideri la seguente istruzione:

F1 = Add( F2, 23 );

Le compilazioni precedenti di istruzione due set:

set 1: Funzioni candidate che hanno primo argomento della frazione del tipo

set 2: Funzioni candidate di cui il secondo argomento può essere convertito nel tipo int

Variant 1

Variant 1 (int può essere convertito da long mediante una conversione standard)

Variant 3

 

Le funzioni presenti 2 sono funzioni per il quale sono conversioni implicite dal tipo di parametro nel tipo di parametro formale e tra tali funzioni esiste una funzione per il quale il “costo„ di convertire il tipo effettivo di parametro al tipo di parametro formale è il più piccolo.

Intersezione tra questi due insiemi è 1. variabile.un esempio di una chiamata di funzione ambigua è:

F1 = Add( 3, 6 );

La chiamata di funzione precedente compila i seguenti gruppi:

set 1: Funzioni candidate che hanno primo argomento di tipo int

set 2: Funzioni candidate che hanno come argomento di tipo int

Variant 2 (int può essere convertito da long mediante una conversione standard)

Variant 1 (int può essere convertito da long mediante una conversione standard)

Si noti che l'intersezione tra questi due insiemi è vuota.di conseguenza, il compilatore genera un messaggio di errore.

Per la corrispondenza dell'argomento, una funzione con n gli argomenti predefiniti vengono considerati n+1 funzione distinta, ognuna con un numero diverso di argomenti.

I puntini di sospensione (...) fungono da carattere jolly; ponderano qualsiasi argomento effettivo.Ciò può portare a molti set ambigui, se non si progetta set di overload della funzione con attenzione cautela.

[!NOTA]

L'ambiguità delle funzioni in overload non possono essere determinate fino al raggiungimento di una chiamata di funzione.A questo punto, gli insiemi sono compilati per ogni argomento nella chiamata di funzione ed è possibile determinare se un overload non ambiguo esiste.Ciò significa che le ambiguità possono restare nel codice fino a evocarle parte di una chiamata di funzione.

Vedere anche

Riferimenti

L'overload