2012-07-27 11 views
10

il seguente pezzo di codice non compila il gcc-4.7.1:È possibile inserire parametri predefiniti del modello prima di quelli non predefiniti?

struct X {}; 

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


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

Tuttavia, questo non lo fa:

struct X {}; 

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


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

gcc-4.7.1 si lamenta:

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

Quindi la mia domanda è: sta mettendo i parametri predefiniti prima che i parametri non predefiniti corretti nel modello di funzione? Se sì, perché non compila il secondo? Se no, perché compila il primo? Come dice lo standard C++ 11 riguardo questa sintassi?

+0

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

+0

@Andrew, il post che hai dato è troppo lungo. Puoi indicare quale risposta dice se è corretto inserire i parametri di default prima di quelli non di default? –

+1

@icando: non c'è nulla nello standard che * proibisca * di mettere argomenti modello predefiniti per i modelli di funzione ovunque. Solo i modelli * di classe * sono limitati. –

risposta

11

E 'espressamente vietato per classi e pseudonimi. n3290 § 14.1.11 stati:

Se un modello-parametro di un template di classe o alias ha un modello-argomento di default, ogni successiva modello-parametro, deve già essere un modello-argomento di default fornito o essere un template parametro pacchetto

per funzioni l'unica limitazione sembra essere correlato alle confezioni parametri:

un parametro di modello confezione di un modello di funzione non si seguito da un altro parametro di modello, a meno che il parametro di modello può essere dedotto o ha un default argomento

Ma è chiaro che non riguarda questo caso.

Dato che nulla in § 14 lo proibisce per le funzioni, sembra che dobbiamo supporre che sia permesso.

A note from a working group reports sembra confermare che questa è l'intenzione. La dicitura proposta originale di quella sezione è:

Se un parametro modello di un modello di classe ha un argomento modello predefinito, tutti i parametri modello successivi devono avere un argomento modello predefinito fornito. [Nota: Questo non è un requisito per i modelli di funzione perché gli argomenti di template possono essere dedotte (14.8.2 [temp.deduct]).]

non riesco a vedere dove questa nota è andato nella versione finale anche se.

+1

quindi è permesso, e l'errore del compilatore è solo un bug di gcc? –

+0

I * penso * è permesso. Se non è stato pensato per essere è un difetto nello standard che non ci sono parole che lo respingono.clang sul mio sistema segfaults la compila anche lui, quindi è sicuramente problematico per i compilatori al momento in entrambi i casi! – Flexo

+1

il clang-3.2 nel mio MacPorts in realtà lo compila. Quindi forse Clang l'ha già risolto? –

Problemi correlati