Il seguente codice si compila bene con gcc e clang.Perché questi sovraccarichi non sono ambigui?
template <typename T>
struct identity
{
typedef T type;
};
template <typename T>
void foo(typename identity<T>::type);
template <typename T>
void foo(T);
int main()
{
foo<int>(0);
}
Sembra che la risoluzione di sovraccarico è la scelta del primo overload (il identity<T>::type
uno).
Qualcuno potrebbe spiegare perché i sovraccarichi non sono ambigui? Per quanto ne so, l'unica differenza tra loro è che l'argomento del primo è un contesto non dedotto e l'argomento del secondo non lo è, ma dal momento che sto fornendo esplicitamente l'argomento del template, capisco perché dovrebbe essere importante.
Interessante. Ovviamente la seconda funzione sarebbe stata scelta se aveste abilitato la deduzione di tipo non istanziando esplicitamente 'pippo (0)' ma 'pippo (0)' invece (Nessuna deduzione di tipo per la funzione meta identit)[email protected] Prowl: Non voglio mettere in dubbio la tua risposta, fai notare che il tuo ragionamento non è così ovvio come potrebbe sembrare. Assegna al parametro foo un valore predefinito e chiama 'foo ()' senza parametro. La tua argomentazione dovrebbe ancora essere applicata, ma ora i sovraccarichi sono davvero ambigui come previsto da HighCommander4. L'istanziazione esplicita dei modelli di funzioni è complicata. –