2016-08-04 24 views
1
template<typename... T> 
void foo(T... args); 

In dem obigen Beispiel wird T nach §14.5.3 Blähton - (4.1) des Standard.Verhalten eines Funktionsparameter Pack

§14.5.3 - (4.1) - In einem Funktionsparameter-Paket (8.3.5); Das Muster ist die Parameterdeklaration ohne die Ellipse.

Was genau passiert hier? Sagen wir, ich nenne die Funktion mit 3 ganzen Zahlen.

foo(1, 2, 3); 

Ist der Parameter Pack wie

erweitert
foo(int arg1, int arg2, int arg3); 

wo arg1, arg2, und arg3 sind nur willkürliche Namen vom Compiler gegeben?

Der Standard sagt, wie „das Muster der Parameter-Deklaration ohne die Auslassungspunkte“

Die andere Art und Weise interpretieren ich, dass ist args bekommt eine einzelne parameter-declartion.Is args seine eigene Art zu bekommen? Ich habe versucht,

std::cout << typeid(args).name; 

, aber das funktioniert nicht, und wirft Compilerfehler. Ich könnte also annehmen, dass es keinen eigenen Typ bekommt. Könnte jemand "blamieren" was hier wirklich passiert und das Verhalten des Funktionsparameter Packs?

+0

Kann der Downvoter erklären, warum die -1? –

Antwort

0

In Ordnung, ich denke, ich habe es herausgefunden. Korrigiere mich, wenn ich falsch liege.

Eine Parametererweiterung tritt auf, wenn sich die Ellipse rechts auf dem Muster befindet. Unser Muster hier ist einfach nur T:

foo(T... args); 

Der Standard legt fest, dass das Ergebnis wird dies ein parameter-declaration sein. Dieses zerfällt in:

Attribut-specifier-Seq opt Decl-specifier-Seq declarator

attribute-specifier-seq ignoriert werden kann.

decl-specifier-seq ist der Typ, T;

declarator... args

Semantisch ist, ist dies ein Funktionsparameter Pack Erklärung. Nichts Besonderes.

Noch einmal, meine Neugier lässt mich für ein bisschen verrückt werden ... heh.