4

我尝试了以下代码,但没有编译。

template <class T, class... A>
void tpool::enqueue(T&& func, A&&... args) {
    std::function<void()> task([func, args] () {
        //...
    });
}
4

2 回答 2

7

只需使用椭圆。根据 C++11 标准的第 5.1.2/23 段:

省略号后的捕获是包扩展 (14.5.3)。[示例

template<class... Args>
void f(Args... args) {
    auto lm = [&, args...] { return g(args...); };
    lm();
}

—<em>结束示例]

注意:有趣的是,GCC 拒绝编译它(参见现场示例):

template <class T, class... A>
void foo(T&& func, A&&... args) {
    std::function<void()> task([func, args...] () {
        //...
    });
}

但是考虑到标准中的上述示例,这绝对是编译器问题。

于 2013-05-13T17:22:32.880 回答
3

args在捕获中使用时,需要省略号:

template <class T, class... A>
void tpool::enqueue(T&& func, A&&... args) {
    std::function<void()> task([func, args...] () {
        //...
    });
}
于 2013-05-13T17:21:44.287 回答