Упорядочение вариативного расширения

Для этого невариативного примера:

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

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

не указано, является ли Func1()или Func2()сначала вычисляется, но и то, и другое должно быть выполнено до вызова MyFunc().

Как эта последовательность работает с расширением аргументов с переменным числом аргументов?

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

Предположим, что f] — это функциональный объект, который меняет свое состояние после первого вызова. Будет ли fвызываться по порядку для каждого сегмента a? Другими словами, будет ли fвызываться для первого элемента в списке a, затем для второго элемента, для третьего и т. д., вместо случайного пропуска расширенного списка? Есть ли то, что мы использовали для вызова точек последовательности между каждым элементом ?

5
задан Griwes 26 May 2012 в 10:14
поделиться