在下面的代码中,我有一个接受“通用引用”(F&&
)的函数。该函数还有一个内部类,它F&&
在其构造函数中接受一个对象。F&&
那时仍然是通用参考吗?ieF
仍然被认为是推导类型?
换句话说,我应该在构造函数初始化列表中使用std::forward<F>
还是?std::move
#include "tbb/task.h"
#include <iostream>
#include <future>
template<class F>
auto Async(F&& f) -> std::future<decltype(f())>
{
typedef decltype(f()) result_type;
struct Task : tbb::task
{
Task(F&& f) : f_(std::forward<F>(f)) {} // is forward correct here?
virtual tbb::task* execute()
{
f_();
return nullptr;
}
std::packaged_task<result_type()> f_;
};
auto task = new (tbb::task::allocate_root()) Task(std::forward<F>(f));
tbb::task::enqueue(*task);
return task->f_.get_future();
}
int main()
{
Async([]{ std::cout << "Hi" << std::endl; }).get();
}