【发布时间】:2013-11-29 04:05:35
【问题描述】:
我在这里看到了一些与在 lambda 中捕获可变参数的 gcc 错误有关的问题。例如:Does lambda capture support variadic template arguments 或 Compiler bug, or non standard code? - Variadic template capture in lambda。我有以下人为的例子来说明我正在尝试做的事情
#include <iostream>
#include <functional>
class TestVariadicLambda {
public:
template<typename... Args>
std::function<void()> getFunc(Args... args) {
return [=]{ printArgs(args...); };
}
template<typename T, typename... Args>
void printArgs(T value, Args... args) {
std::cout << value << ", ";
printArgs(args...);
}
void printArgs() {std::cout << "\n";}
};
在 gcc 4.8.2 中出现以下错误:
../src/TestVariadicLambda.h: In lambda function:
../src/TestVariadicLambda.h:9:25: error: parameter packs not expanded with ‘...’:
return [=]{ printArgs(args...); };
^
../src/TestVariadicLambda.h:9:25: note: ‘args’
../src/TestVariadicLambda.h:9:29: error: expansion pattern ‘args’ contains no argument packs
return [=]{ printArgs(args...); };
^
我的问题是我该如何解决这个问题,因为它在 gcc4.8 中不起作用
【问题讨论】:
-
它对你帮助不大,但代码用 clang 3.4 (trunk) 编译。
-
我刚刚用 g++4.9 快照对其进行了测试,它也可以在那里工作。
-
这是个好消息,但不幸的是,如果您需要使用 gcc 4.8,它对您没有帮助
-
看看我的愚蠢工作我猜..
-
我添加了使用 GCC 4.7(已测试)编译的答案,对 GCC 4.8(已测试)可能有点晚了,也许它仍然对您有用。您应该注意,使用这种代码 clang 会产生程序集膨胀,这是 GCC 性能更好的少数情况之一。
标签: c++ c++11 lambda variadic-templates