C++ 11是否允许在lambda中和lambda中进行以下嵌套的可变参数扩展?

Fai*_*ali 4 c++ lambda variadic-templates c++11

任何人都可以向我确认在C++ 11中允许使用以下代码(包括函数参数包的嵌套扩展)(我当然感谢任何对该标准的引用):

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


template<int ... Ns> struct IntPack {
  template<class ... MemTs> 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");
}
Run Code Online (Sandbox Code Playgroud)

谢谢!
PS因为有人在下面问过,这段代码适用于我实现通用lambdas的clang补丁(还不是标准的C++,还只是一个提议) - 我没有尝试过任何其他编译器 - 我不确定它是否适用于最新版本clang trunk目前(它可能会) - 我当然欢迎任何有关它是否与任何实现可变参数和lambda的主流编译器编译的信息.

Ric*_*ith 6

是的,这是有效的,Clang支持它.

$ 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
Run Code Online (Sandbox Code Playgroud)

相关规则是[temp.variadic] p5:

未展开的参数包名称的外观是不正确的.

这不适用于这种情况,因为

名称显示在包扩展模式中的参数包将通过该包扩展进行扩展.

...并且lambda中包的使用在函数参数包扩展的模式内.