2016-07-02 6 views
0

私は次のスニペットとのトラブルに実行している:clangを使用してはSTDの結果を変換できません::バインド先はstd ::機能

std::promise<int> promise;  
auto operation = [](std::promise<int> promise) { promise.set_value(1); }; 
auto fn = std::bind(operation, std::move(promise)); 
fn(); 

私は次のエラーを取得:

candidate template ignored: substitution failure [with _Args = <>]: implicit instantiation of undefined template 'std::__1::__bind_return<(lambda at promise.cpp:7:12), std::__1::tuple >, std::__1::tuple<>, false>' operator()(_Args&& ...__args)

を感謝あらかじめ!

+2

移動キャプチャが必要です。 'std :: bind'はそれを行えません。 [ラムダはC++ 14から始めることができます](http://stackoverflow.com/questions/8640393/move-capture-in-lambda)、C++ 11ではできません。 –

+2

@IgorTandetnik 'std :: bind'は動きのキャプチャをうまくやることができます。問題は、キャプチャされたものを左辺値として渡すことです。 –

+0

あなたのタイトルは誤解を招く:現在のコードには 'std :: function'は含まれていません。 – ysdx

答えて

0

イゴールは全く正しいですが、私の目的のために、これは非常にうまく働いていた、と互換性c++11です:値の代わりstd::promiseへの参照を取るためにoperationを変更し、使用することにより

std::promise<int> promise;  
auto operation = [](std::promise<int>& promise) { promise.set_value(1); }; 
std::packaged_task<void()> fn { std::bind(operation, std::move(promise)) }; 
fn(); 

std::packaged_taskは、移動可能でコピー不可能なので、私はstd::promiseを保持している関数を持つという本来の目的を達成することができます。

+0

はい、悲しいことに、 'std :: not_packaged_task'はありません。これは' std :: promise'と関連する共有状態を持つオーバーヘッドを避けることができます。 – ysdx

1

バインドされたオブジェクトは左辺値として渡され、promiseはコピーできません。

ラムダを左辺値参照にすると、コードがコンパイルされますが、それは良い考えではありません。

auto operation = [](std::promise<int>& promise) { promise.set_value(1); }; 
//         ^
関連する問題