std::函数指针指向成员函数,MSVC2010 SP1 中采用 rvalue 参数

std::function pointer to member function taking rvalue arguement MSVC2010 SP1

本文关键字:函数 参数 SP1 rvalue 指针 成员 std MSVC2010      更新时间:2023-10-16

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

似乎您的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接受。