Sequencing among a variadic expansion
c++, c++11, sequence-points, variadic-functions, variadic-templates
Solution
Yes, brace enclosed initializer lists guarantee an evaluation order of left-to-right, while function calls do not. So `MyFunc2` will sequence correctly.
The Wikipedia article covers this: https://en.wikipedia.org/wiki/Variadic_templates
Is there what we used to call sequence points between each item?
No, while it uses a comma token it is not the comma operator.
Problem
For this non-variadic example: ``` int Func1(); double Func2(); void MyFunc( int, double ); int main() { MyFunc( Func1(), Func2() ); //... } ``` it's not specified whether `Func1()` or `Func2()` is computed first, just that both must be done before `MyFunc()` is called. How does this sequencing work with the expansion of variadic arguments? ``` template < typename Func, typename ...Args > void MyFunc2( Func &&f, Args&& ...a ) { int b[] = { f( std::forward<Args>(a) )... }; //... } ``` Let's say that `f` is a function object that changes its state after its first call. Will `f` be called in order for each segment of `a`? In other words, will `f` be called on the first item in `a`'s list, then the second item, the third, etc., instead of randomly skipping through the expanded list? Is there what we used to call sequence points between each item?