我试过下面的代码,但没有编译。如何在lambda函数中捕获变量数量的参数
template <class T, class... A>
void tpool::enqueue(T&& func, A&&... args) {
std::function<void()> task([func, args]() {
//...
});
}
我试过下面的代码,但没有编译。如何在lambda函数中捕获变量数量的参数
template <class T, class... A>
void tpool::enqueue(T&& func, A&&... args) {
std::function<void()> task([func, args]() {
//...
});
}
只需使用省略号。每款C++ 11标准的5.1.2/23:
A capture followed by an ellipsis is a pack expansion (14.5.3). [ Example:
template<class... Args> void f(Args... args) { auto lm = [&, args...] { return g(args...); }; lm(); }
—end example ]
注:有趣的是,GCC拒绝编译这个(见live example):
template <class T, class... A>
void foo(T&& func, A&&... args) {
std::function<void()> task([func, args...]() {
//...
});
}
但考虑到上述来自标准的例子,这绝对是一个编译器问题。
当您在拍摄使用args
,你需要省略号:
template <class T, class... A>
void tpool::enqueue(T&& func, A&&... args) {
std::function<void()> task([func, args...]() {
//...
});
}
我试过你的代码,但不能再次编译。 'error:expected','before'...'token''错误:'...'token'之前的预期标识符'错误:参数包没有用'...'扩展' – Mpac 2013-05-13 17:35:28
@ MarcoPacini您使用的是GCC吗?在这种情况下,编译器中似乎存在一个错误(例如[Andy Prowl回答](http://stackoverflow.com/a/16527660/440558))。 – 2013-05-13 17:38:34
是的,我使用安装了macport的GCC 4.7.2。 – Mpac 2013-05-13 17:42:18
令人惊讶的是,你是否记住了整个标准或只是做一个快速的样子? – maverik 2013-05-13 17:25:01
@maverik:当然我做了一个快速的检查;) – 2013-05-13 17:25:56
看起来像这个海湾合作委员会的错误:http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41933(你的报价是一个相当晚的除标准) – 2013-05-13 17:53:55