我想创建一个std :: function绑定到一个带有rvalue参数的成员函数。这是我的尝试,它不能编译(“xxfunction(154):错误C2664:......你不能将左值绑定到右值参考”等)。
class C
{
public:
void F(std::string &&s)
{
//do something with s
}
C(){}
};
C c;
std::function<void(std::string&&)> pF = std::bind(&C::F,&c,std::placeholders::_1);
//somewhere far far away
pF(std::string("test"));
我做了一些阅读,我认为它与std :: function no有关使用完美转发,但我无法弄清楚如何让它工作。
编辑:
std::function<void(std::string&)> pF = [&c](std::string&in){c.F(std::move(in));};
这是一个半可行的工作,但它并不完美,因为调用pF现在可以使用左值并移动它。
std::string s("test");
pF(s);
auto other = s; //oops
答案 0 :(得分:0)
看来你的std::bind
实现不支持通过占位符完美转发,但是因为你有C ++ 11而且std::bind
是丑陋的,所以使用lambdas:
std::function<void(std::string&&)> pF
= [&c](std::string&& str)
{
c.F(std::move(str));
};
修改强>
注意:虽然已接受,但这个答案并不是解决问题的方法,因为它不是std::bind
,而是MSVC10的std::function
实施方案存在缺陷。但是,该建议导致了一种解决方法,因此被PorkyBrain接受。