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

时间:2011-07-26 14:25:20

标签: c++ gcc c++11

以下代码段不会在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...) { };
}

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

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

1 个答案:

答案 0 :(得分:6)

两件事:

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