2016-04-15 16 views
0

自動パラメータを参照として定義した汎用ラムダを使用してスレッドを作成するにはどうすればよいですか?例えば参照を汎用パラメータとして使用して汎用ラムダからスレッドを作成する

、何がこれに概念的に同等の何かを達成するための正しい方法のようになります。

int vi = 0; 
auto lambda = [](auto &v) {}; 
auto t = std::thread(lambda, std::ref(vi)); 

のgcc-5.3ために不足しているタイプを訴える:、サイド質問として

/opt/gcc/el6/gcc-5.3.0/include/c++/5.3.0/functional: In instantiation of ‘struct std::_Bind_simple<main()::<lambda(auto:2&)>(std::reference_wrapper<int>)>’: 
/opt/gcc/el6/gcc-5.3.0/include/c++/5.3.0/thread:137:59: required from ‘std::thread::thread(_Callable&&, _Args&& ...) [with _Callable = main()::<lambda(auto:2&)>&; _Args = {std::reference_wrapper<int>}]’ 
testLambdaCapture.cpp:52:41: required from here 
/opt/gcc/el6/gcc-5.3.0/include/c++/5.3.0/functional:1505:61: error: no type named ‘type’ in ‘class std::result_of<main()::<lambda(auto:2&)>(std::reference_wrapper<int>)>’ 
    typedef typename result_of<_Callable(_Args...)>::type result_type; 
                 ^
/opt/gcc/el6/gcc-5.3.0/include/c++/5.3.0/functional:1526:9: error: no type named ‘type’ in ‘class std::result_of<main()::<lambda(auto:2&)>(std::reference_wrapper<int>)>’ 
     _M_invoke(_Index_tuple<_Indices...>) 
     ^

一般的なパラメータが次のように値渡しされると、なぜ動作しますか?

auto lambda = [](auto v) {}; 
auto t = std::thread(lambda, vi); 

答えて

2

は、固定された:この場合、

#include <thread> 

int vi = 0; 
auto lambda = [](auto &&v) {}; 
auto t = std::thread(lambda, std::ref(vi)); 

// this works too 
auto rv = std::ref(vi); 
auto t2 = std::thread(lambda, rv); 

を、それはテンプレート引数であるかのように、自動& &が推測されています。したがって、インスタンス化中の実際のタイプは、必要に応じてconst T&またはT&&です。

+1

はい、それは実際に 'auto&'がめったに意味を成さない理由の良い例です。 'auto'か' auto &&'のいずれかです。 – SergeyA

+0

@ SergeyA auto&&nbsp;が意味を成す意味のある例がありますか? –

1

問題は、タイプstd::reference_wrapper<int>の右辺値からauto&を導出しようとしていますが、非const左辺値参照が右辺値から導き出せないため、そうすることができません。ターゲット関数が既知の型(控除を意味せず、変換演算子が適用されます)または非参照型(変換が必要でないことを意味します)の参照がある場合のみ、それは機能します。

+0

あなたのステートメントによると、 'std :: thread([](int&v){}、std :: ref(vi));'のように聞こえます。私は何かを誤読しましたか? –

+2

@ComeRaczy、はい、あなたは間違っていました。あなたの例では、**控除**はありませんが、 'std :: ref'からlvalue参照への変換だけでうまくいきます。 – SergeyA

関連する問題