std :: function指向成员函数的指针,采用rvalue参数MSVC 2010 SP1

时间:2013-01-30 14:31:21

标签: c++ rvalue-reference std-function stdbind

我想创建一个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

1 个答案:

答案 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接受。