C ++ 0x Variadic Parameter Pack: синтаксис - PullRequest
10 голосов
/ 26 июля 2011

следующий фрагмент кода не будет компилироваться в gcc4.6.1:

template <typename... TS>
void do_stuff(TS... ts)
{
  auto f = [](TS... things) { };
}

Выдает ошибку о том, что вещи пакета не были расширены. Однако следующий код компилируется:

template <typename... TS>
void do_stuff(TS... ts)
{
  auto f = [](TS... things...) { };
}

Обратите внимание на дополнительный оператор распаковки после вещей в списке параметров. Я никогда не сталкивался с ситуацией, когда во время декларации нужно было расширять пакет с переменным числом аргументов. Поэтому мой вопрос к вам, добрые люди:

Является ли это допустимым синтаксисом C ++ 0x (фрагмент, который компилируется) или это просто причуда с GCC, когда дело доходит до работы с переменными типами?

1 Ответ

6 голосов
/ 27 июля 2011

Две вещи:

  • Да, GCC неправильно отклонить [](TS... things) { }. Возможно, это еще не было реализовано.
  • То, что вы объявили [](TS ... things...) { }, эквивалентно [](TS... things, ...). В C ++ (не в C) вы можете оставить запятую перед многогранным эллипсисом в стиле C. Поэтому вместо void printf(char const *fmt, ...) вы можете объявить void printf(char const *fmt...). Вот что происходит в твоей лямбде. Первый многоточие - это распаковка пакета параметров, а второй многоточие - это вариационный эллипс в стиле C.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...