2

右辺値引数を取るメンバー関数にバインドされた std::function を作成したいと思います。これがコンパイルされない私の試みです(「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 に関係していると思いますが、それを機能させる方法がわかりません。

編集:

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
4

1 に答える 1

0

あなたのstd::bind実装はプレースホルダーを介した完全な転送をサポートしていないようですが、C ++ 11を使用していてstd::bindとにかく醜いので、ラムダを使用してください:

std::function<void(std::string&&)> pF 
  = [&c](std::string&& str)
{ 
  c.F(std::move(str)); 
};

編集:

:受け入れられていますが、この回答は当面の問題の解決策ではありませんstd::bind.MSVC10のstd::function実装に欠陥があるわけではないためです。ただし、提案は回避策につながったため、PorkyBrainに受け入れられました。

于 2013-01-30T14:42:11.820 に答える