、なぜstd :: packaged_task <void()>は無効ですか? MSVC2012を使用
次のコードをコンパイルして、なぜこれがそうである
std::packaged_task< void() > task([](){ std::cout << "hello world" << std::endl; });
std::thread t(std::move(task));
t.join();
実行に失敗しながら、次のコードはコンパイルして
std::packaged_task< int() > task([]()->int{ std::cout << "hello world" << std::endl; return 0; });
std::thread t(std::move(task));
t.join();
を期待通りに実行されますか?
編集:回避策として 、vs2012ライブラリにバグがあることが、ボイド
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();
注意を返す関数にはstdを取得することを約束::のstd ::未来を使用することが可能です約束事をl-値参照として渡し、約束を移すことを強いるstd :: threadでは、約束を値渡しまたはr値参照によって渡すとコンパイルされません。これは、実装が期待どおりに動作しないstd :: bind()を使用するためです。
興味深いことに...コンパイル時に2番目のエラーはありますか? – Yuushi
これはおそらくMSVC++のバグです。 –
私はの実装にたどり着き、最終的には関数オブジェクトの実行状態の格納に、特に '_State_manager'というテンプレートクラスで行われます。 '_State_manager'の' void'状態のための特殊化はありません。これはバグかもしれません。私は完全に昼食に出ることもできますが、すべてが崩れているように見えるものです。 –
WhozCraig