С++ 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-стиля.