2013-02-02 9 views
18

Ich habe diesen Code:Warum ruft die Überladung von Template- und Nicht-Template-Funktionen mit der "gleichen Signatur" die Nicht-Template-Funktion auf?

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

void f(const int &) {} 

int main() { 
    f(0); 
} 

Warum es die zweite, anstatt zuerst nicht nennen? Ich würde von ihnen als die gleichen denken, aber sie sind eindeutig nicht, da ich keinen Neudefinitionsfehler erhalte.

+2

http://stacked-crooked.com/view?id=f9aac9532f21077433027f9ae341417b Anrufe Nummer 2 hier. – Rapptz

+0

@Rapptz Ja, ich habe bearbeitet. – user2030677

Antwort

19

Weil die zweite Überladung keine Vorlage ist.

Wenn eine Template-Funktion und eine Nicht-Template-Funktion beide zum Auflösen eines Funktionsaufrufs geeignet sind, wird die Nicht-Template-Funktion ausgewählt.

Von Ziffer 13.3.3/1 des C++ 11 Standard:

[...] In Anbetracht dieser Definitionen, eine tragfähige Funktion F1 ist definiert als eine bessere Funktion als eine andere tragfähige Funktion F2 zu sein wenn für alle Argumente i ICSi (F1) keine schlechtere Konvertierungssequenz ist als ICSi (F2), und dann ist [...] F1 eine Nicht-Template-Funktion und F2 ist eine Funktion Template-Spezialisierung [...]

+1

Dann vielleicht als eine Nebenfrage könnten Sie beantworten, warum [# 2 auf diesem einen ruft?] (Http://stacked-crooked.com/view?id=f9aac9532f21077433027f9ae341417b) Was eigentlich nur die Frage zu ändern, auch. – Rapptz

+0

@Rapptz: Genau weil # 2 keine Vorlage ist. Fehle ich etwas? –

+0

Leseverständnis ist ein bisschen aus. – Rapptz

6

Eine ist eine Vorlage und die andere ist nicht, sie sind definitiv nicht gleich.

Die Überladungsauflösung ist so konzipiert, dass eine Nicht-Vorlage einer Vorlagenfunktion vorgezogen wird, alles andere gleich.

Verwandte Themen