Предоставляет ли C ++ 11 следующее вложенное вариационное расширение внутри и из лямбда?

Может ли кто-нибудь подтвердить мне, что следующий код (который включает вложенные расширения пакета функций) разрешен в C ++ 11 (я бы, безусловно, оценил любые ссылки на стандарт):

template int variadic_fun(VFTs ... vfts) { 
  return sizeof ...(vfts); 
}


template struct IntPack {
  template static int variadic_memfun(MemTs ... MemArgs) {
    return variadic_fun(([=]() {
      cout << "MemArgs = " <<  MemArgs << "\n";
      cout << "Ns = " << Ns;
     //Note the nested expansion of MemArgs here:
      cout << "variadic_fun(MemArgs...) = " << variadic_fun(MemArgs ...) << "\n";
      cout << "MemArgs[Ns] = " <<  MemArgs[Ns] << "\n";
      return 0;
    })()...);
  }  
};


int main() {
  IntPack<0, 1, 2>::variadic_memfun("123", "ABC", "XYZ");
}

Спасибо!
Постскриптум Поскольку кто-то спросил ниже, этот код работает с моим патчем clang, который реализует общие лямбды (еще не стандартный C ++, все еще просто предложение). Я не пробовал его с любыми другими компиляторами - и не уверен, работает ли он с последним стволом clang в настоящее время (возможно, это так) - я бы, конечно же, приветствовал любую информацию о том, компилирует ли он какие-либо основных компиляторов, которые реализуют вариации и лямбды.

4
nl ja de
Вы можете добавить информацию о том, какой компилятор вы попробовали. По крайней мере, это не соответствует текущей версии ideoone .
добавлено автор iammilind, источник
самая сложная модель расширения, которую я видел до сих пор = D
добавлено автор pepper_chico, источник

1 ответы

Да, это действительно так, и Кланг поддерживает его.

$ clang++ your-example.cpp -std=c++11
$ ./a.out
MemArgs = 123
Ns = 0variadic_fun(MemArgs...) = 3
MemArgs[Ns] = 1
MemArgs = ABC
Ns = 1variadic_fun(MemArgs...) = 3
MemArgs[Ns] = B
MemArgs = XYZ
Ns = 2variadic_fun(MemArgs...) = 3
MemArgs[Ns] = Z

Соответствующее правило [temp.variadic] p5 :

Появление имени пакета параметров, который не расширен, плохо сформирован.

В этом случае это не применяется, поскольку

Пакет параметров, имя которого отображается в шаблоне расширения пакета, расширяется расширением пакета.

... и использование пакета в лямбда входит в шаблон расширения пакета аргументов функции.

6
добавлено
Спасибо, Ричард!
добавлено автор Faisal Vali, источник
pro.cxx
pro.cxx
3 049 участник(ов)

C/C++ chat 0. Простые вопросы, лабы и о IDE — в чат новичков @supapro 1. Не хамим, не переходим на личности, не вбрасываем утверждения без доказательств 2. No Ads, offtop, flood Объявления о вакансиях и евенты - в лс @AlexFails https://t.me/ProCxx/259155

supapro.cxx
supapro.cxx
1 925 участник(ов)

Чат для тех, кто немного знает C++, простые вопросы по реализации, синтаксису и ide – сюда, а для другого есть: /Главный чат по серьезным вопросам — @ProCxx /Чат по обсуждению всего — @fludpac

C++ Russia
C++ Russia
384 участник(ов)

Сообщество разработчиков C++ в Telegram.

cxx.Дискуссионная
cxx.Дискуссионная
298 участник(ов)

это не двач, общайтесь вежливо; разговор на почти любые темы; Не согласны с баном? В лс @AlexFails, @ivario

C++ для маленьких и тупых
C++ для маленьких и тупых
105 участник(ов)

Лоу левел (по среднему IQ участников) чатик ExtremeCode @extremecode Флудилка @extremecode_rest