1

次のような関数が与えられた場合

void MyFunction(std::unique_ptr<int> arg);

次のようなファンクターを作成することはできません (MSVC 2012)

std::function<void(std::unique_ptr<int>)> f = std::bind(&MyFunction, std::placeholders::_1);

問題はバインドではありません-使用すると機能しauto f = std::bind(...)ます。また、 a の使用shared_ptrも機能します

  • unique_ptr が許可されないのはなぜですか?
  • これは MSVC の問題ですか、それとも一般的な C++11 の制限ですか?
  • 関数定義を変更せずに回避策はありますか?
4

2 に答える 2

3

以下のコードは、gcc 4.8 を使用して正常にコンパイルされます。"g" が move (左辺値を右辺値に変換する) で呼び出されない場合、コードはコンパイルに失敗することに気付くでしょう。前述のように、unique_ptr がコピー可能ではないため、失敗は operator()( ... ) が呼び出されたときにのみ発生するため、バインドは成功します。shared_ptr にはコピー コンストラクターがあるため、呼び出し "f" は許容されます。

#include <functional>
#include <memory>


void foo1( std::shared_ptr<int> ){}
void foo2( std::unique_ptr<int> ){}

int main() 
{
    using namespace std::placeholders;

    std::function<void(std::shared_ptr<int>)> f = std::bind( foo1, _1 );
    std::function<void(std::unique_ptr<int>)> g = std::bind( foo2, _1 );

    std::unique_ptr<int> i( new int(5) );
    g( move( i ) ); //Requires the move

    std::shared_ptr<int> j( new int(5) );
    f( j ); //Works fine without the move
    return 0;
}
于 2014-06-29T19:36:51.387 に答える
0

回避策は

void MyFunction(std::unique_ptr<int>& arg)

ただし、関数定義を変更できない場合は機能しません。

于 2013-06-17T06:00:19.873 に答える