2012-07-27 4 views
10

Das folgende Stück Code auf gcc-4.7.1 nicht kompiliert:Kann die Funktion Standard-Template-Parameter vor nicht standardmäßigen gesetzt werden?

struct X {}; 

template <class T = X, typename U> 
void f(const U& m) { 
} 


int main() { 
    f<>(0); 
} 

Dies ist jedoch ein nicht:

struct X {}; 

template <class T = X, typename U> 
void f(const U& m) { 
    auto g = []() {}; 
} 


int main() { 
    f<>(0); 
} 

gcc-4.7.1 klagt:

c.cpp: In function 'void f(const U&)': 
c.cpp:5:15: error: no default argument for 'U' 

Also meine Frage ist: setzt Default-Parameter vor nicht-Standard-Parameter in Funktionsvorlage korrigieren? Wenn ja, warum kompiliert der zweite nicht? Wenn nein, warum kompiliert der erste? Wie sagt der C++ 11 Standard über diese Syntax?

+0

http://stackoverflow.com/questions/2447458/default-template-arguments-for-function-templates – Andrew

+0

@Andrew, der Beitrag, den Sie gaben, ist zu lang. Können Sie darauf hinweisen, welche Antwort besagt, ob es richtig ist, Default-Parameter vor Nicht-Standard-Parameter zu setzen? –

+1

@icando: Im Standard gibt es nichts, was * verbietet * das Setzen von Standardschablonenargumenten für Funktionsschablonen irgendwo. Nur * class * -Templates sind eingeschränkt. –

Antwort

11

Es ist explizit für Klassen und Aliase verboten. n3290 § 14.1.11 heißt es:

Wenn ein Template-Parameter einer Klasse-Vorlage oder Alias-Vorlage eine Standardvorlage-Argument hat, jede nachfolgende Template-Parameter wird entweder ein Standard-Template-Argument geliefert oder sein ein Template-Parameter Pack

Für Funktionen der einzige Einschränkung scheint Parameter Pack bezogen werden:

ein Template-Parameter Pack einer Funktion Vorlage nichtsein sollvon einem anderen Template-Parameter gefolgt, es sei denn, dass Template-Parameter abgeleitet werden kann, oder eine Standard Argument

Aber klar, die nicht diesen Fall nichts an.

Da nichts in § 14 es für Funktionen verbietet, müssen wir annehmen, dass es erlaubt ist.

Ein note from a working group reports scheint zu bestätigen, dass dies die Absicht ist. Der ursprünglich vorgeschlagene Wortlaut dieses Abschnitts lautet:

Wenn ein Template-Parameter einer Klassenvorlage ein Standard-Template-Argument hat, wird allen nachfolgenden Template-Parametern ein Standard-Template-Argument übergeben. [Anmerkung: Dies ist keine Voraussetzung für die Funktionsschablonen weil Vorlage Argument abgeleitet werden könnte (14.8.2 [temp.deduct]).]

Ich kann nicht sehen, wo die Notiz in der endgültigen Fassung ging obwohl.

+1

so ist es erlaubt, und der compiler-fehler ist nur ein gcc-fehler? –

+0

Ich * denke * es ist erlaubt. Wenn es nicht so sein sollte, ist es ein Fehler im Standard, dass es keine Formulierung gibt, die es ablehnt.Ich klicke auf mein System segfaults kompiliert es auch, so ist es sicherlich problematisch für Compiler im Moment so oder so! – Flexo

+1

der clang-3.2 in meinen MacPorts kompiliert es tatsächlich. Vielleicht hat das schon geklingelt? –

Verwandte Themen