C++ std::function的右值引用<;void()>;?

C++ std::function的右值引用<;void()>;?,c++,c++11,visual-studio-2013,rvalue-reference,stdthread,C++,C++11,Visual Studio 2013,Rvalue Reference,Stdthread,我正在尝试编译一些第三方代码,但它不起作用,因为它包含一个类似以下内容的调用: void async(std::function<void()> f) { typedef std::function<void()> F; auto task_wrapper = [](F&& f){ f(); // some other stuff }; std::async(std::launch::defe

我正在尝试编译一些第三方代码,但它不起作用,因为它包含一个类似以下内容的调用:

void async(std::function<void()> f)
{
    typedef std::function<void()> F;
    auto task_wrapper = [](F&& f){
        f();
        // some other stuff
    };
    std::async(std::launch::deferred, task_wrapper, std::move(f));
}
void异步(std::函数f)
{
typedef std::函数F;
自动任务包装器=[](F&&F){
f();
//一些其他的东西
};
std::async(std::launch::deferred,task_包装,std::move(f));
}
它失败于:

error C2664: cannot convert argument 1 from 'std::function<void (void)>' to 'F &&'
错误C2664:无法将参数1从'std::function'转换为'F&&'
我希望有人能向我解释为什么这会失败,而其他使用参数和返回类型的调用(如以下类型)则不会失败:

template<typename Ret, typename... Args>
void threadPool::async(std::function<Ret(Args...)> f, Args... args)
{
    typedef std::function<Ret(Args...)> F;
    auto task_wrapper = [](F&& f, Args&&... args){
        f(args...);
        // other stuff
    };

    std::async(std::launch::deferred,
        task_wrapper, std::move(f), std::move(args...));
}
模板
void threadPool::async(std::函数f,Args…Args)
{
typedef std::函数F;
自动任务包装器=[](F&&F,Args&&…Args){
f(args…);
//其他东西
};
标准::异步(标准::启动::延迟,
任务包装器,std::move(f),std::move(args…);
}
编辑:


我在使用Visual Studio 2013编译时遇到此错误。

您使用的编译器是什么?我在g++4.8.2VS2013中没有发现任何错误。我正在检查gcc是否有效,谢谢你提供的信息。我不相信你的“类似通话”的说法。您的第二个示例看起来完全错误(即,比我在库中预期的更糟糕的代码——例如缺少
forward
s)。请生成一个无法编译的简单、可复制的案例,而不是伪代码。这不是发布整个库的邀请:将其简化为非编译的简单案例。@PiotrS。为什么不按价值衡量,然后行动呢?没有必要在这里复制。(因为C++14我们确实可以使用通用捕获)此外,来自
std::async
std::future
在析构函数中等待,所以在这里使用异步调用对您没有任何好处