Corrispondenza di argomenti
Le funzioni in overload vengono selezionate per la migliore corrispondenza delle dichiarazioni di funzione nell'ambito corrente con gli argomenti forniti nella chiamata di funzione. Se viene trovata una funzione appropriata, questa viene chiamata. "Appropriato" in questo contesto indica una delle seguenti operazioni:
Una corrispondenza esatta è stata trovata.
Una conversione semplice è stata eseguita.
Una promozione a intero è stata eseguita.
Esiste una conversione standard al tipo di argomento desiderato.
Esiste una conversione definita dall'utente (operatore di conversione o costruttore) al tipo di argomento desiderato.
Sono stati trovati argomenti rappresentati dai puntini di sospensione.
Il compilatore crea un set di funzioni candidate per ciascun argomento. Le funzioni candidate sono funzioni in cui l'argomento effettivo in quella posizione può essere convertito nel tipo dell'argomento formale.
Un set delle "migliori funzioni di corrispondenza" viene compilato per ogni argomento e la funzione selezionata è l'intersezione di tutti i set. Se l'intersezione contiene più funzioni, l'overload è ambiguo e genera un errore. La funzione che infine verrà selezionata è sempre una corrispondenza migliore di qualsiasi altra funzione del gruppo per almeno un argomento. In caso contrario (se non è chiaro quale prevale), la chiamata di funzione genera un errore.
Considerare le seguenti dichiarazioni (le funzioni vengono contrassegnate come Variant 1, Variant 2 e 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 );
Con l'istruzione precedente vengono compilati due set:
Set 1: Funzioni candidate con il primo argomento della frazione di tipo |
Set 2: Funzioni candidate il cui secondo argomento può essere convertito nel tipo int |
---|---|
Variante 1 |
Variante 1 (int può essere convertito in long mediante una conversione standard) |
Variante 3 |
|
Le funzioni del Set 2 sono funzioni per le quali vi sono conversioni implicite dal tipo di parametro effettivo nel tipo di parametro formale e tra tali funzioni vi è una funzione per cui il "costo" di conversione del tipo di parametro effettivo nel tipo di parametro formale è il più ridotto.
L'intersezione dei due set è la Variante 1. Un esempio di una chiamata di funzione ambigua è:
F1 = Add( 3, 6 );
Con la chiamata di funzione precedente vengono compilati i seguenti set:
Set 1: Funzioni candidate con il primo argomento di tipo int |
Set 2: Funzioni candidate con il secondo argomento di tipo int |
---|---|
Variante 2 (int può essere convertito in long mediante una conversione standard) |
Variante 1 (int può essere convertito in long mediante una conversione standard) |
Si noti che l'intersezione tra questi due set è vuota. Pertanto, il compilatore genera un messaggio di errore.
Per la corrispondenza all'argomento, una funzione con n argomenti predefiniti viene trattata come n+1 funzioni separate, ognuna con un numero diverso di argomenti.
I puntini di sospensione (...) fungono da caratteri jolly; corrispondono a qualsiasi argomento effettivo. In tal modo, è possibile che vengano generati molti set ambigui se non si progettano set della funzione in overload con estrema attenzione.
Nota
L'ambiguità delle funzioni in overload non può essere determinata finché non viene rilevata una chiamata di funzione.A questo punto, i set vengono compilati per ogni argomento nella chiamata di funzione ed è possibile determinare se esiste un overload non ambiguo.Ciò significa che le ambiguità possono restare nel codice finché non vengono chiamate da una chiamata di funzione particolare.