c++ 0x可变参数包:语法

C++0x Variadic Parameter Pack: Syntax

本文关键字:语法 参数 变参 0x c++      更新时间:2023-10-16

以下代码段在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在处理可变类型时的一个怪现象?

两件事:

  • 是的,GCC拒绝[](TS... things) { }是错误的。有可能它还没有实施。
  • 你方由[](TS ... things...) { }申报的内容等同于[](TS... things, ...)。在c++中(不是在C中),您可以在C风格的可变省略号前省略逗号。所以你可以声明void printf(char const *fmt...)而不是void printf(char const *fmt, ...)。这就是发生在的。第一个省略号是参数包解包,第二个省略号是c风格的可变省略号。