Для этого невариативного примера:
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
, затем для второго элемента, для третьего и т. д., вместо случайного пропуска расширенного списка? Есть ли то, что мы использовали для вызова точек последовательности между каждым элементом ?