2013-02-02 3 views
18

ho questo codice:Perché il sovraccarico di template e non template funziona con la "stessa firma" chiama la funzione non template?

template< 
    class T = const int & 
> void f(T) {} 

void f(const int &) {} 

int main() { 
    f(0); 
} 

Perché si chiama il secondo posto di prima? Penserei a loro come se fossero uguali, ma chiaramente non lo sono dato che non ottengo un errore di ridefinizione.

+2

http://stacked-crooked.com/view?id=f9aac9532f21077433027f9ae341417b chiama il numero 2 qui. – Rapptz

+0

@Rapptz Sì, ho modificato. – user2030677

risposta

19

Perché il secondo sovraccarico non è un modello.

Quando una funzione modello e una funzione non modello sono entrambe valide per la risoluzione di una chiamata di funzione, la funzione non modello è selezionata.

al paragrafo 13.3.3/1 della C++ 11 standard:

[...] Date queste definizioni, una funzione F1 praticabile è definita come una funzione meglio di un'altra funzione F2 praticabile se per tutti gli argomenti i, ICSi (F1) non è una sequenza di conversione peggiore di ICSi (F2), e quindi [...] F1 è una funzione non modello e F2 è una specializzazione modello di funzione [...]

+1

Allora forse una domanda a parte potresti rispondere perché [chiama il n. 2 su questo?] (Http://stacked-crooked.com/view?id=f9aac9532f21077433027f9ae341417b) che in realtà ha solo causato la modifica della domanda. – Rapptz

+0

@Rapptz: Precisamente perché # 2 non è un modello. Mi sto perdendo qualcosa? –

+0

La comprensione della lettura è un po 'spenta. – Rapptz

6

Uno è un modello e l'altro no, sono definitivi non è esattamente la stessa cosa.

La risoluzione di sovraccarico è progettata per preferire un modello diverso da una funzione basata su modelli, a parità di tutte le altre condizioni.