c++variadic-templatespackaged-task

C++ template parameter pack automatically adds & to its parameters


Check the below code.

#include <future>

template <class F, class... Args>
void do_something(F f, Args... args) {
    using return_type = typename std::result_of<F(Args...)>::type;

    // Why below gives an error?
    std::packaged_task<return_type(Args...)> task(f, args...);
}

int func(int a, int b) {

}
int main() {
    do_something(func, 1, 2);
}

The packaged_task constructor gives a following error.

error: no matching function for call to 'std::packaged_task<int(int, int)>::packaged_task(int (*&)(int, int), int&, int&)'

8 |     std::packaged_task<return_type(Args...)> task(f, args...);

The thing I don't understand is that why f and args became a reference type in the constructor? The Args... were int, int types whereas args... just became int&, int&. Where is this coming from?


Solution

  • packaged_task do not have the signature you want.

    compiler is saying there is no such function. (probably with candidates below it)