Se si esegue l'overload di una funzione e poi chiama con un argomento che si abbina perfettamente uno dei sovraccarichiRegole di conversione implicita di argomenti di template
int f(int){return 3;}
int f(bool){return 4;}
... //inside main()
f(1); //Calls f(int)
il compilatore sceglie semplicemente questo (perfetto) partita prima di tentare qualsiasi conversioni implicite . Comunque ho cercato di sovraccaricare una funzione template come in
template <bool veracity>
int f(){return 1;}
template <int amount>
int f(){return 2;}
... //inside main()
f<1>();
ma il compilatore di continuo complainning su chiamata ambigua alla f sovraccarico(), affermando che potrebbe essere o f<true>()
o f<1>()
. Il compilatore non dovrebbe semplicemente scegliere la corrispondenza perfetta, invece di provare a convertire in true?
Avevo l'impressione che la conversione implicita per gli argomenti del modello fosse effettivamente più restrittiva della conversione implicita degli argomenti di funzione. C'è un modo per aggirare questo problema?
vedo. Sai se esiste una ragione specifica per cui le regole sono così? Voglio dire, c'è qualche difficoltà tecnica o qualcosa che renderebbe impraticabile per i compilatori l'applicazione della logica "esatto-prima-partita/implicita-conversione-secondo" (utilizzata negli argomenti della funzione) agli argomenti del modello? – Malabarba
No, non lo so per certo. La mia ipotesi sarebbe che è soprattutto perché le regole sono già complesse e l'aggiunta di un insieme di regole per il "ranking" come fa per il sovraccarico le renderebbe ancora più importanti. Non ne sono sicuro, ma suppongo che a causa dell'interazione con le altre regole per i modelli, le regole di classificazione risulterebbero almeno un po 'diverse da quelle per i sovraccarichi, quindi non sarebbe solo questione di dire "le funzioni candidate formeranno un set di sovraccarico da risolvere in conformità con §13.3." –
Ha senso.Grazie. =) – Malabarba