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

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

Ist dieser Code nach dem C++ - Standard wohlgeformt?Sind Variadic-Argumente nach einem default-Parameter wohlgeformt?

Das vorgeschlagene Duplikat enthält nicht die gleichen Aufrufe der Funktion.

+1

Kein Duplikat: http://stackoverflow.com/questions/29098835/can-parameter-pack-function-arguments-be-defaulted, enthält keine Aufrufe der gleichen Form. – Puppy

+0

Sieht für mich wie ein Duplikat aus. Selbst wenn der Aufruf nicht identisch ist, zeigt die Antwort in dieser Frage die beiden Teile des Standards, die sagen, dass sie selbst in diesem Fall nicht gültig sind. –

+1

Das Problem in dieser Frage wurde in Clang behoben, aber Clang lehnt diesen Code immer noch ab. – Puppy

Antwort

14

Aufgrund CWG 777 ist die Erklärung gilt:

In einer bestimmten Funktionsdeklaration, alle jeweils Parameter im Anschluss an einen Parameter mit einem Standardargument wird ein Standardargumente haben in diese geliefert oder ein vorherige Deklarationen oder soll eine Funktion sein Parameter pack.

Abzug soll in allen drei Fällen erfolgreich sein, da das Standardargument keinen Unterschied zu der Art des Abzugs macht: Wenn kein Argument für die Packung Parameter args zur Verfügung gestellt, es über [temp.arg.explicit]/3 auf die leere Packung geschlossen ist, da sonst die übliche Regel in [temp.deduct.call]/1 gilt (da das Paket eindeutig nicht in einem nicht-abgeleiteten Kontext ist).

Verwandte Themen