5

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?

+0

Che cosa significa "cosa abbiamo usato per chiamare i punti di sequenza"? –

+0

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

risposta

5

Sì, le liste di inizializzazione incluse tra parentesi garantiscono un ordine di valutazione da sinistra a destra, mentre le chiamate di funzione no. Pertanto, MyFunc2 verrà eseguito correttamente.

L'articolo di Wikipedia si occupa di questo: https://en.wikipedia.org/wiki/Variadic_templates

C'è quello che abbiamo usato per chiamare i punti di sequenza tra ogni elemento?

No, mentre si utilizza una virgola gettone non è l'operatore virgola.

+0

Interessante. Tuttavia, l'esempio con 'pass' non funziona con GCC-4.7. Le espressioni in 'pass {std :: cout << args ...}' sono eseguite da destra a sinistra sulla mia macchina. Si tratta di un bug in GCC-4.7? O la descrizione su Wikipedia è errata? – nosid

+0

@nosid Penso di ricordare che GCC aveva quell'errore. litb ha scritto quel segmento di articoli e non sbaglia mai (hehe, gli chiederò la prossima volta che verrà online) – Pubby

+0

Hai ragione. L'ho trovato in §8.5.4.4 (draft n3290): "[..] Le clausole di inizializzazione [..] sono valutate nell'ordine in cui appaiono." e "Questo ordine di valutazione vale [..] - anche se normalmente non ci sono vincoli di sequenziamento sugli argomenti di una chiamata." – nosid