【发布时间】:2011-10-13 11:28:53
【问题描述】:
以下代码sn-p在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 语法(编译的 sn-p)还是只是 GCC 在处理可变参数类型时的一个怪癖?
【问题讨论】:
-
这不是“捕获”,捕获发生在
[]括号内。您只是指定一个参数列表。 (但很好的问题!) -
谢谢,我编辑了它以使其更有意义。我知道它不是在变量意义上捕获,但似乎 lambda 如何“捕获”类型为 TS 的问题...
-
啊,我想我找到了答案,是“不”:stackoverflow.com/questions/3575901/…
-
但是 lambda 函数本身没有模板化。当需要评估 lambda 表达式时,这些类型将被很好地定义。
-
嗯,对,忽略那条评论。其实你好像也可以说
doStuff(TS... ts...)。我不知道(TS... ts)是不是允许成员函数声明的简写...