Ответ 1
Это не порядок расширения пакета параметров, который отличается, это порядок оценки аргумента функции.
f_Swallow
(
[&]()
{
result.push_back(arg);
return true;
}
()...
) ;
Для краткости давайте просто укажем лямбда имя funcN
, где N
- номер параметра. Учитывая четыре аргумента, пакет параметров будет расширяться любым соответствующим компилятором следующим образом:
f_Swallow(func1(), func2(), func3, func4()) ;
Порядок оценки аргументов функции не указан в С++. Компилятор мог бы оценивать их по порядку (например, вашу версию Clang), в обратном порядке (например, вашу версию MSVC) или в любом порядке, который ему нравится. Вы не можете рассчитывать на порядок оценки.
Чтобы получить то, что вы хотите, вы можете поместить выражения в контекст, в котором указан порядок оценки. Например:
template <typename... T>
std::vector<int> f(T ...arg)
{
std::vector<int> result;
(void)std::initializer_list<int> { (result.push_back(arg), 0)... };
return result;
}
В С++ 17 вы сможете сделать следующее с сгибами выражения:
template <typename... T>
std::vector<int> f(T ...arg)
{
std::vector<int> result;
(result.push_back(arg), ...);
return result;
}