С++ 0x Variadic Parameter Pack: Синтаксис

следующий фрагмент кода не будет компилироваться под 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...) { };
}

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

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

Ответ 1

Две вещи:

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