5

Для этого не-VARIADIC Например:Секвенирование среди VARIADIC расширения

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

+0

Что означает «то, что мы использовали для вызова точек последовательности»? –

+0

Я знаю об этом немного, но такие выражения, как «есть точка последовательности между * x * и * y *», были заменены на «* x *, секвентируется до * y *». Новое полное определение является более точным и включает помещения для нарезки. – CTMacUser

ответ

5

Да, список закрытых списков инициализаций гарантирует порядок оценки слева направо, а вызовы функций - нет. Таким образом, MyFunc2 будет правильно следовать.

Статья Википедии охватывает это: https://en.wikipedia.org/wiki/Variadic_templates

Есть ли то, что мы привыкли называть точек последовательности между каждым элементом?

Нет, в то время как он использует запятой лексемы не оператор запятой.

+0

Интересно. Однако пример с 'pass' не работает с GCC-4.7. Выражения в 'pass {std :: cout << args ...}' выполняются справа налево на моей машине. Это ошибка в GCC-4.7? Или это неверное описание в Википедии? – nosid

+0

@ nosid Думаю, я помню, что у GCC была эта ошибка. litb написал этот сегмент статьи, и он никогда не ошибается (хе-хе, я спрошу его в следующий раз, когда он выйдет онлайн) – Pubby

+0

Вы правы. Я нашел это в § 8.5.4.4 (проект n3290): «[..] Предложения инициализатора [..] оцениваются в том порядке, в котором они появляются». и «Это упорядочение оценки имеет место [..] - хотя обычно нет ограничений последовательности для аргументов вызова». – nosid

Смежные вопросы