5

Für dieses Nicht-variadische Beispiel:Sequenzierung unter einer variadische Expansion

int  Func1(); 
double Func2(); 
void MyFunc(int, double); 

int main() 
{ 
    MyFunc(Func1(), Func2()); 
    //... 
} 

es ist nicht angegeben, ob Func1() oder Func2() zuerst berechnet wird, nur, dass beide getan werden muss, bevor MyFunc() aufgerufen wird.

Wie funktioniert diese Sequenzierung mit der Erweiterung variadischer Argumente?

template < typename Func, typename ...Args > 
void MyFunc2(Func &&f, Args&& ...a) 
{ 
    int b[] = { f(std::forward<Args>(a))... }; 
    //... 
} 

Lasst uns sagen, dass f ein Funktionsobjekt ist, das seinen Zustand nach dem ersten Aufruf ändert. Will f für jedes Segment von a aufgerufen werden? Mit anderen Worten, wird f auf den ersten Artikel in a 's Liste aufgerufen werden, dann der zweite Artikel, der dritte usw., anstatt nach dem Zufallsprinzip durch die erweiterte Liste zu überspringen? Gibt es das, was wir verwendet haben, um Sequenzpunkte zwischen jedem Gegenstand zu nennen?

+0

Was bedeutet "was wir früher Sequenzpunkte nannten"? –

+0

Ich weiß nur ein bisschen darüber, aber Aussagen wie "Es gibt einen Sequenzpunkt zwischen * x * und * y *" wurden durch "* x * vor dem y *" ersetzt. " Die neue vollständige Definition ist genauer und enthält Anpassungen für Threading. – CTMacUser

Antwort

5

Ja, geschweifte Klammern Initialisierungslisten garantieren eine Bewertungsreihenfolge von links nach rechts, während Funktionsaufrufe nicht. So wird MyFunc2 korrekt ablaufen.

Der Wikipedia-Artikel umfasst diese: https://en.wikipedia.org/wiki/Variadic_templates

Gibt es, was wir Sequenzpunkte zwischen jedem Punkt nennen verwendet? Keine

, während es verwendet Komma es Token ist nicht der Komma-Operator.

+0

Interessant. Das Beispiel mit 'pass' funktioniert jedoch nicht mit GCC-4.7. Die Ausdrücke in 'pass {std :: cout << args ...}' werden von rechts nach links auf meinem Rechner ausgeführt. Ist das ein Fehler in GCC-4.7? Oder ist die Beschreibung auf Wikipedia falsch? – nosid

+0

@nosid Ich denke, ich erinnere mich zu hören, dass GCC diesen Bug hatte. litb schrieb dieses Artikelsegment und er hat sich nie geirrt (hehe, ich werde ihn das nächste Mal fragen, wenn er online kommt) – Pubby

+0

Sie haben Recht. Ich habe es in § 8.5.4.4 (Entwurf n3290) gefunden: "[..] Die Initialisierungsklauseln [..] werden in der Reihenfolge ausgewertet, in der sie auftreten." und "Diese Bewertungsreihenfolge gilt [..] - obwohl es normalerweise keine Sequenzierungsbeschränkungen für die Argumente eines Aufrufs gibt." – nosid