C++ 使用std::bind移动lambda

C++ 使用std::bind移动lambda,c++,c++11,visual-studio-2013,lambda,C++,C++11,Visual Studio 2013,Lambda,在visual studio 2013中编译此代码时,我收到一个编译错误(错误C2064:term未计算为使用0个参数的函数)) #include <string> #include <iostream> #include <functional> template<class F> void foo(F& callback) { callback(); } template<class F> void bar(F&

在visual studio 2013中编译此代码时,我收到一个编译错误(
错误C2064:term未计算为使用0个参数的函数)

#include <string>
#include <iostream>
#include <functional>

template<class F>
void foo(F& callback)
{
    callback();
}

template<class F>
void bar(F& callback)
{
    auto barCallback = std::bind([](F& callback)
    {
        callback();
        std::cout << "world" << std::endl;
    }, std::move(callback));

    foo(barCallback);
}

int main()
{
    std::string s("hello ");
    auto f = std::bind([](std::string& s) { std::cout << s; }, std::move(s));
    bar(f);
}
#包括
#包括
#包括
样板
void foo(F&callback)
{
回调();
}
样板
空栏(F&C)
{
auto barCallback=std::bind([](F&callback)
{
回调();

std::cout这就是我想到使用std::move和std::bind:)的原因,但是现在我被这个编译问题困住了。您遇到了。您需要以某种方式清除类型-例如,通过
std::function
。我验证了使用
bar(std::function(f))
main
中的
解决了这个问题。不幸的是,这意味着字符串被复制到
std::function
,这是我首先要避免的。而
std::ref
不起作用?