C++ 0x Variadic参数包:语法

bst*_*our 10 c++ gcc c++11

以下代码片段不会在gcc4.6.1下编译:

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

它会抛出一个错误,指出包装没有扩展.但是,以下代码可以编译:

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

注意参数列表中的内容之后的额外解包操作符.我从未见过在声明过程中必须扩展可变背包的情况.所以我向你们提出的问题是:

这是合法的C++ 0x语法(编译的代码片段)还是在处理可变参数类型时它只是与GCC的怪癖?

Joh*_*itb 6

两件事情:

  • 是的,GCC拒绝是错误的[](TS... things) { }.它可能还没有实现.
  • 您声明的[](TS ... things...) { }内容相当于[](TS... things, ...).在C++(不在C语言中)中,您可以在C风格的可变参数省略号之前省略逗号.所以void printf(char const *fmt, ...)你可以声明,而不是做void printf(char const *fmt...).这就是你的lambda中发生的事情.第一个省略号是参数包解包,第二个省略号是C风格的可变参数省略号.