以下代码片段不会在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的怪癖?
两件事情:
[](TS... things) { }
.它可能还没有实现.[](TS ... things...) { }
内容相当于[](TS... things, ...)
.在C++(不在C语言中)中,您可以在C风格的可变参数省略号之前省略逗号.所以void printf(char const *fmt, ...)
你可以声明,而不是做void printf(char const *fmt...)
.这就是你的lambda中发生的事情.第一个省略号是参数包解包,第二个省略号是C风格的可变参数省略号. 归档时间: |
|
查看次数: |
421 次 |
最近记录: |