【发布时间】:2013-05-13 17:18:10
【问题描述】:
我尝试了以下代码,但没有编译。
template <class T, class... A>
void tpool::enqueue(T&& func, A&&... args) {
std::function<void()> task([func, args] () {
//...
});
}
【问题讨论】:
标签: c++ templates c++11 lambda
我尝试了以下代码,但没有编译。
template <class T, class... A>
void tpool::enqueue(T&& func, A&&... args) {
std::function<void()> task([func, args] () {
//...
});
}
【问题讨论】:
标签: c++ templates c++11 lambda
只需使用省略号。根据 C++11 标准的第 5.1.2/23 段:
后跟省略号的捕获是包扩展 (14.5.3)。 [例子:
template<class... Args> void f(Args... args) { auto lm = [&, args...] { return g(args...); }; lm(); }—结束示例 ]
注意:有趣的是,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 '...' tokenerror: expected identifier before '...' tokenerror: parameter packs not expanded with '...'