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?
Was bedeutet "was wir früher Sequenzpunkte nannten"? –
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