MSVC2012 を使用して、
次のコードは、期待どおりにコンパイルおよび実行されます
std::packaged_task< int() > task( []()->int{ std::cout << "hello world" << std::endl; return 0; } );
std::thread t( std::move(task) );
t.join();
次のコードはコンパイルと実行に失敗します
std::packaged_task< void() > task( [](){ std::cout << "hello world" << std::endl; } );
std::thread t( std::move(task) );
t.join();
これはなぜですか?
編集: 回避策として、 std::promise を使用して void を返す関数で std::future を取得することが可能です
std::promise<void> promise;
auto future = promise.get_future();
std::thread thread( [](std::promise<void> &p){ std::cout << "hello world" << std::endl; p.set_value(); }, std::move(promise) );
future.wait();
vs2012 ライブラリには std::thread のバグがあり、promise を l-value 参照として渡し、promise を移動する必要があることに注意してください。promise を値または r- で渡すとコンパイルされません。値参照。これは、実装が期待どおりに動作しない std::bind() を使用しているためと考えられます。