Per questo esempio non variadic:Sequencing tra un'espansione variadic
int Func1();
double Func2();
void MyFunc(int, double);
int main()
{
MyFunc(Func1(), Func2());
//...
}
non è specificato se Func1()
o Func2()
viene calcolato prima, solo che entrambi devono essere fatto prima MyFunc()
è chiamato.
Come funziona questo sequenziamento con l'espansione degli argomenti variadici?
template < typename Func, typename ...Args >
void MyFunc2(Func &&f, Args&& ...a)
{
int b[] = { f(std::forward<Args>(a))... };
//...
}
Diciamo che f
è un oggetto funzione che cambia il suo stato dopo la sua prima chiamata. Sarà chiamato f
in ordine per ogni segmento di a
? In altre parole, sarà f
chiamato sul primo elemento nell'elenco a
, quindi il secondo elemento, il terzo, ecc., Invece di saltare casualmente nell'elenco espanso? Esiste ciò che abbiamo usato per chiamare i punti di sequenza tra ogni elemento?
Che cosa significa "cosa abbiamo usato per chiamare i punti di sequenza"? –
Ne conosco solo un po ', ma affermazioni come "c'è un punto di sequenza tra * x * e * y *" sono state sostituite con "* x * è sequenziato prima di * y *." La nuova definizione completa è più precisa e include gli alloggi per il threading. – CTMacUser