В текущем стандарте, как , уже не ответил , он не разрешен. Вот еще одно обходное решение для достижения чего-то подобного, определяя функцию как вариационную, вместо того, чтобы брать список инициализаторов.
#include
#include
// begin helper functions
template
void add_to_vector(std::vector* vec) {}
template
void add_to_vector(std::vector* vec, T&& car, Args&&... cdr) {
vec->push_back(std::forward(car));
add_to_vector(vec, std::forward(cdr)...);
}
template
std::vector make_vector(Args&&... args) {
std::vector result;
add_to_vector(&result, std::forward(args)...);
return result;
}
// end helper functions
struct S {
S(int) {}
S(S&&) {}
};
void bar(S&& s) {}
template
void foo(Args&&... args) {
std::vector args_vec = make_vector(std::forward(args)...);
for (auto& arg : args_vec) {
bar(std::move(arg));
}
}
int main() {
foo(S(1), S(2), S(3));
return 0;
}
Шаблоны Variadic могут обрабатывать ссылки r-значения соответственно, в отличие от initializer_list.
В этом примере кода я использовал набор небольших вспомогательных функций для преобразования вариационных аргументов в вектор, чтобы сделать его похожим на исходный код. Но, конечно, вы можете написать рекурсивную функцию с вариационными шаблонами напрямую.