2016-02-25 27 views
15
template <typename... Args> 
void bark(int = 0, Args&&... args) {} 

int main() { 
    bark(); 
    bark(1); 
    bark(1, 2); 
} 

Questo codice è ben formato secondo lo standard C++?Gli argomenti variadici dopo un parametro predefinito sono ben formati?

Il duplicato proposto non contiene le stesse chiamate della funzione.

+1

Non è un duplicato: http://stackoverflow.com/questions/29098835/can-parameter-pack-function-arguments-be-defaulted, non contiene chiamate dello stesso modulo. – Puppy

+0

Sembra un duplicato per me. Anche se l'invocazione non è identica, la risposta in quella domanda mostra le due parti dello standard che dicono che non è valido nemmeno in questo caso. –

+1

Il problema sollevato in questa domanda è stato risolto in Clang, ma Clang continua a rifiutare questo codice. – Puppy

risposta

14

causa CWG 777, la dichiarazione è valida:

In una data dichiarazione di funzione, tutti ciascuno parametri successivi ad un parametro con un argomento predefinito devono avere argomenti standard fornito in questo o un precedenti dichiarazioni o deve essere una funzione parameter pack.

detrazione dovrebbe avere successo in tutti e tre i casi, dal momento che l'argomento di default fa alcuna differenza per la natura della deduzione: se non viene fornito alcun argomento per il parametro pacchetto args, è dedotto al pacco vuoto via [temp.arg.explicit]/3, altrimenti la solita si applica la regola in [temp.deduct.call]/1 (poiché il pacchetto non è chiaramente in un contesto non dedotto).

Problemi correlati